2016-11-23 77 views
0

我在發帖之前查看了一些「FGETS」問題,並且我收集的是可能是一個新行字符,這會導致手動輸入問題。以兩種方式使用Fgets

int main (int argc, char *argv[]){ 

    char temp[1000]; 
    FILE *user_file; 

    printf("Starting....\n"); //Used for user visual. 


    if(argc == 2){ //open file 
     user_file = fopen(argv[1],"r"); 
     if(user_file == NULL){ 
      printf("No file was found."); 
      exit(2); 
     }else{ 
      fgets(temp,strlen(temp),user_file); 
     } 
    }else if(argc > 2){ // Will exit if arguments are greater than 2. 
     printf("Maximum args 2.\n"); 
     exit(1); 
    }else{ 
     printf("File was not provided, please enter the text to convert.\n"); //If the user doesnt provide a file allow manual input. 
     fgets(temp,strlen(temp),stdin); 
    } 

    printf("%s\n",temp); 


    return 0; 
}//End main 

問題:

  1. 爲什麼不與fgets打開txt文件,我向它提供的CMD線,並將其存儲到臨時數組?

  2. 如果未提供文件,爲什麼在「其他」語句中跳過Fgets?

  3. 爲什麼在兩種情況下都會跳過打印?

嘿,順便謝謝你的幫助。 如果您知道一個已被問過的類似問題,您可以將它發佈在評論中,以便我可以閱讀它。

+0

你'fopen'看起來不錯,我 - 你確定文件是否存在?你在使用區分大小寫的文件系統嗎? – Dai

+0

對不起,我不相信我是,是的我的朋友,它與我的代碼文件一起在桌面上。 @戴 –

+0

你給它的輸入是什麼,你看到的輸出是什麼? –

回答

0

你的代碼有多個問題。

這是第一個問題:

char temp[1000]; 

你的緩衝聲明未初始化緩衝區的內容 - 所以每個字符值的值將是無論是在原始內存前面。在C中,大多數字符串都是「空終止的」,因此終止NULL0 - 零)很重要,否則您可能會遇到緩衝區溢出。

「最佳」的方法是零出(零初始化)陣列/緩衝器使用它之前,像這樣(在C99):

char temp[1000] = {0}; 

...這樣temp將包含所有0值(NULL)所以寫入它的任何東西(假設它不超過999字節)將自動具有空終止符(儘管fgets將追加終止0值,但並不是C中的每個函數都這樣做)。

的第二個問題是有關第一:你使用的運行字符串長度的函數strlen得到strlen緩衝區的大小。這是不正確的,因爲在編譯時將緩衝區大小固定爲1000. strlen將返回第一個0NULL)char值的索引,因爲您尚未對緩衝區進行零初始化,所以此時這是未定義的行爲(所以如果緩衝區的原始原始數據包含一個零,它可以立即返回0,否則它可能因爲從未有任何零值而溢出1000.

...因此,你需要重新使用緩衝區長度,像這樣:

#define TEMP_LENGTH 1000 

char temp[ TEMP_LENGTH ]; 

... 

fgets(temp, TEMP_LENGTH, user_file); 

最後,你犯同樣的錯誤,當你調用fgets(temp, ..., stdin)

+0

我真的很感謝深入的解釋,我會馬上工作。我的朋友有一個美好的夜晚,並保持祝福。 @Dai –

0

未初始化陣列temp[],並嘗試查找strlen(temp)。你甚至不知道數組中是否存在NUL。嘗試這樣做:

#define MAXLINE 1000 

,並改變你的來電fgets()

fgets(temp, MAXLINE, user_file); 
... 
fgets(temp, MAXLINE, stdin); 
+0

謝謝我的朋友 –

0

這裏問題出在你的代碼中,而不是通過strlen(temp)傳遞的第二個參數中傳遞的數值。

fgets(temp,strlen(temp),user_file); 

正確的做法是: -

fgets(temp,1000,user_file);