2014-04-21 222 views
0

12至23行運行。但是在添加if語句時實際上並沒有運行。它會編譯並運行。它詢問第一個printf語句,然後在我選擇一個字符時終止。爲什麼會發生這種情況,我該如何解決。爲什麼這個代碼編譯但不能實際工作?

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

int main() 
{ 
    char ch, file_name[25]; 
    FILE *fp; 
    printf("Enter [A] and select file or [X] to exit:"); // Prompt user to select file or exit 
    scanf("%c",&ch); 
    scanf("%c",&ch); 

    if (ch=='A') 
    { 
     printf("Enter the file name\n"); // if user chooses 'A' this code should run 
     gets(file_name); 

     fp = fopen(file_name,"r"); // reading file 

     if(fp == NULL) 
     { 
      perror("File not found.\n"); 
      exit(EXIT_FAILURE); 
     } 
     printf("Contents of %s are:\n", file_name); 

     while((ch = fgetc(fp)) != EOF) 
      printf("%c",ch); 
    } 
    else if (ch=='X') 
    { 
     printf("Exiting program..."); 
     exit(0); 
    } 
} 
+0

爲什麼應該編譯代碼實際上工作?非語法錯誤代碼並不意味着它沒有邏輯錯誤 –

回答

0

有一大類程序可以編譯但不能正常運行。這就是語法錯誤和運行時/邏輯錯誤之間的區別。

scanf("%c",&ch); 
scanf("%c",&ch); 

假設這是擺脫換行字符,但它是一個壞主意讀取到ch,自認爲應該保持的第一個字符。

如果是這種情況,只需將其讀入一些垃圾變量,以便保留ch

char ch, junk, file_name[25]; 
: 
scanf("%c",&ch); 
scanf("%c",&junk); 

不幸的是,這種方法可能有很多其他問題。如果你想要一個體面的線路輸入功能,你可以找到一個here。這比使用gets()好得多,這本質上是不安全的。

它具有緩衝區溢出檢測和預防功能,自動刷新輸入行太長,提示輸出等。一旦你用它來得到一個輸入線,所有你需要做的是比較,與你想要的東西,是這樣的:

if (strcmp (buff, "A") == 0) 
    doSectionA(); 
else 
    if (strcmp (buff, "X") == 0) 
     doSectionX(); 
+0

謝謝你。我會考慮使用fgets而不是獲取 – user3555512

1

因爲你有兩個呼叫scanf ..

在首先,您正在成功讀取輸入'A'或'X'。 在下次調用中,您正在讀取先前按下的換行符(\n),並將其放入同一個變量ch中。所以它不符合任何if條款,只是出來的節目..

而是做出臨時變量第二個電話..

char temp; 
scanf("%c", &temp); 

而且fgets優於gets

+0

非常感謝。它現在完成這項工作。 – user3555512

0

我想你沒有正確地從文件中讀取,請嘗試:

char buff[255]; //define buffer to read lines 

while (!feof(fp)){ 
     memset(buff, '\0', sizeof(buff)); 
     fgets(buff, 255, (FILE*)fp); 
     printf("%s", buff); 
     } 

fclose(fp); //don't forget to close