2016-02-11 31 views
0

我正在嘗試讀取c中的多行輸入。我輸入的第一個輸入得到的打印完全正常,但其餘的都缺少第一個字符。C中的多行輸入 - 故障排除

所以,我試圖打印如果輸入的名稱(字符串)是一個有效的標識符名稱或不,並且我想要無限循環中的輸入。我知道這裏已經發布了許多類似的問題,但是他們都沒有爲我工作。我不確定我在這裏做錯了什麼。 :(

int main() { 
     char str[1000]; 

     for(;;){ 
       //Below, I have tried every possibility that I can think of 
       scanf("%[^\n]d%*c%*s", str); 
       //fgets(str, 1000, stdin); 
       printf("str[0]: %c\n", str[0]); 

       //Flushing the Buffer  
       while ((dump = getchar()) == '\n' && dump != EOF); 
       //fflush(stdout); 
     } 
} 

我把我的整個代碼,只需在情況下,

#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 

int main() { 
     char str[1000]; 
     int i, dump, check; 

     for(;;){ 
       check = 0; 
       scanf("%[^\n]d%*c%*s", str); 
       //fgets(str, 1000, stdin); 
       printf("str[0]: %c\n", str[0]); 
       if ((str[0] == '_') || (isalpha(str[0]))){ 
         for (i = 1; i < strlen(str); i++) { 
           if (isalpha(str[i]) || isdigit(str[i])) { 
             continue; 
           } else{ 
             printf("2Invalid\n"); 
             check = 1; 
           } 
         } 
         if (check != 1){ 
           printf("String: %s\n", str); 
           printf("Valid\n"); 
         } 
       } else{ 
         printf("Invalid\n"); 
         break; 
       } 

       //Flushing the Buffer  
       while ((dump = getchar()) == '\n' && dump != EOF); 
       //fflush(stdout); 
     } 
} 

輸入: asdasffa 輸出: STR [0]:一個 字符串:asdasffa Valid

輸入: & asdaf 輸出: STR [0]:一個(when str[0] is "&", not "a") 字符串:asdaf 有效

輸入: %ASDF 輸出: STR [0]: a (when str[0] is "%", not "a") 字符串:asdf 有效

我在猜測我刷新緩衝區的方式導致這個問題?

謝謝!

回答

2

該行while ((dump = getchar()) == '\n' && dump != EOF); 消耗一個字符。嘗試在此之後添加對ungetc的調用,以便scanf可以看到它。並刪除冗餘dump != EOF。如果轉儲== \n,那麼它不會是EOF。

+0

感謝您的回答。對不起,我是C語言的新手。請你詳細說明一下如何添加一個調用ungetc? –

+0

那麼,你真的應該只使用fgets而不是scanf,並完全刪除while循環。如果你想保留它,只需在循環之後添加'ungetc(dump,stdin)'即可。這將一個字符推回到要由scanf讀取的流上。 –

+0

太棒了!它爲我工作!非常感謝! –