2014-03-14 25 views
-5

我想計算字符串的長度,然後複製到另一個字符串不使用C庫函數,但是當我使用fgets()功能來讀取鍵盤的字符串,代碼沒有顯示實際值長度以及目標字符串。我使用fgets()函數而不是gets(),因爲編譯器說gets()函數是「不推薦使用」的。但是當我將代碼中的sizeof(source)更改爲整數值時,假設50代碼正常工作。任何人都可以告訴我這段代碼有什麼問題,爲什麼編譯器會說,gets()函數已被棄用。與fgets()功能不起作用

這是代碼:

#include <stdio.h> 
#include <stdlib.h> 

int len(char *source); 
char *coppy(char *dest,char *source); 
int main (void){ 
    char *source,*dest; 
    source=(char *)malloc(len(source)+1); 
    printf("enter string:"); 
    fgets(source,sizeof(source),stdin); 
    if(source[len(source)-1]=='\n'){ 
     source[len(source)-1]='\0'; 
    } 

    dest=(char *)malloc(len(source)+1); 
    coppy(dest,source); 
    printf("dest=%s\n",dest); 
    printf("length source=%d\n",len(source)); 
    printf("length dest=%d\n",len(dest)); 
    return 0; 
} 

int len(char *source){ 
    int i=0; 

    while(*source!='\0'){ 
     source++; 
     i++; 
    } 
    return i; 
} 

char *coppy(char *dest,char *source){ 
    while(*source!='\0'){ 
     *dest=*source; 
     source++; 
     dest++; 
    } 
    *dest='\0'; 
    return dest; 
} 

這是結果,當運行代碼:

enter string:programming 
dest=pro 
length source=3 
length dest=3 
+5

更正:'fgets()'已經工作了幾十年。這是*你的代碼*使用'fgets'不工作。 –

回答

0

你的錯誤是在你如何爲source

分配內存source=(char *)malloc(len(source)+1);

你認爲len(source)是什麼?玩電腦,並通過您的len功能運行。我很驚訝你的代碼編譯和運行。未初始化的char*上的len函數應該是未定義的行爲。

這就是爲什麼你的代碼失敗,你沒有分配足夠的內存來保存你的輸入字符串。

+0

我期待源的長度是分配的memory.and我應該怎麼做來修復代碼? – harianja

+0

@harianja:但是你使用源的長度來爲源分配內存。你覺得這不對嗎?分配類似256字節的東西或任何足以容納最大字符串的內容;在這種情況下可能會好起來。 – AndyG

4

這是你的第一個錯誤:

source=(char *)malloc(len(source)+1) 

您傳遞source的功能len你初始化之前,這是不確定的行爲。從此,任何事情都可能發生。

第二個錯誤是你的fgets使用:

fgets(source,sizeof(source),stdin); 

fgets的第二個參數應該是多少字符可以被寫在,不sizeof(source)。如有必要,請閱讀fgetssizeof的文檔。

+0

我期待源的長度是分配的memory.and我應該怎麼做來修復代碼? - – harianja

+1

首先,您需要決定分配多少內存。在用戶輸入之前你不知道,所以它必須是一個常量。然後你可以寫'source = malloc(MAX_LENGTH + 1);'。或者甚至更好,你可以寫'char source [MAX_LENGTH + 1];'並且完全避免動態分配。然後,將'MAX_LENGTH + 1'作爲長度傳遞給'fgets'。 ('fgets'最多隻能讀取'MAX_LENGTH'個輸入字符,然後它會一直追加空終止符)。 –

+1

順便說一句,如果用戶在鍵入「MAX_LENGTH」字符之前按Enter鍵,那麼用'fgets'讀入的字符串將在其末尾有\ n。你可以檢查這個,並用它來判斷他們是否按Enter鍵,如果你在意的話。在複製到'dest'之前,您可能需要刪除它。 –