2014-02-06 44 views
0

好吧,首先,我是一個編程的業餘愛好者,我想嘗試一些東西。我想製作一個C程序,它將讀取一行,然後如果這些字符被接受,以便在字符有效或不有效時打印「接受」或「拒絕」。在打印結果前閱讀整行

所以我用了一個while循環和一些if-else如果添加可行的字符。可行的字符是字母表中的字母',''。 '/''['']'。問題是,在我輸入整行後,它爲行上的每個字符打印ACCEPTED和REJECTED。我怎樣才能讓程序先讀全行,然後打印結果?

#include <stdio.h> 

int main(void) { 
    char c; 
    c=getchar(); 
    while(c!=EOF) { 
     while (c!='\n') { 
      if (c>='a' && c<='z') { 
       printf("OK!\n"); 
      } 
      else if(c==','|| c=='.' ||c=='/') { 
       printf("OK!\n"); 
      } 
      else if(c==']'||c=='[') { 
       printf("OK!\n"); 
      } 
      else { 
       printf("ERROR!\n"); 
      } 
      c=getchar(); 
     } 
     c=getchar();  
    } 
} 
+0

歡迎來到SO。請閱讀[問]和[幫助]如何提問。也許顯示你的代碼? – OldProgrammer

+0

很高興聽到您爲此編寫了一個程序。你能發佈該代碼來幫助我們回答你的問題嗎? – haccks

+1

你所描述的症狀適合於在'for'循環裏面有'printf'語句。正如其他評論者所說,如果您向我們展示代碼,我們可以直接回答您的問題。 –

回答

0

您可以使用scanf並把空間的格式說明%c之前忽略空白。

char ch; 
scanf(" %c", &ch); 
+0

要逐字讀取答案,答案很好。它不應該得到一個downvote。 +1。注意:您應該提及爲什麼在每個字符後面打印「ACCEPTED」或「REJECTED」(當然是因爲\ n)。 – haccks

2

對不起,我原來的回答似乎沒有涉及到你的問題。脫脂閱讀失敗。

感謝您發佈代碼,它正確回答您的問題時會有所幫助。

忽略風格就目前而言,我會改變你的代碼以這種方式使其打印OK只有當你完成解析整個行,它到底是什麼@ScottMermelstein說,但代碼。

#include <stdio.h> 

int main(void) { 
    int c; // This needs to be an int otherwise you won't recognize EOF correctly 
    int is_ok; 

    c=getchar(); 
    while(c!=EOF) { 
     is_ok = 1; // Let's assume all characters will be correct for each line. 
     while (c!='\n') { // So long as we are in this loop we are on a single line 
      if (c>='a' && c<='z') { 
       // Do nothing (leave for clarity for now) 
      } 
      else if(c==','|| c=='.' ||c=='/') { 
       // Do nothing (leave for clarity for now) 
      } 
      else if(c==']'||c=='[') { 
       // Do nothing (leave for clarity for now) 
      } 
      else { 
      is_ok = 0; // Set is_ok to false and get out of the loop 
       break; 
      } 
      c=getchar(); 
     } 

     if (is_ok) // Only print our result after we finished processing the line. 
     { 
      printf("OK!\n"); 
     } else 
     { 
      printf("ERROR!\n"); 
     } 

     c=getchar();  
    } 

    return 0; // If you declare main to return int, you should return an int... 
} 

但是,我會建議模塊化你的代碼多一點。這將隨着時間和練習而來,但如果您將事情隱藏在適當命名的函數中,則可以用更容易理解的方式編寫內容。

#include <stdio.h> 

int is_valid_char(int c) 
{ 
    return (isalpha(c) || c == ',' || c == '.' || c == '/' || c == '[' || c == ']'); 
} 

int main(void) { 
    int c; 
    int is_valid_line; 

    c=getchar(); 
    while(c!=EOF) { 
     is_valid_line = 1; 

     while (c!='\n') { 
      if (!is_valid_char(c)) { 
       is_valid_line = 0; // Set is_valid_line to false on first invalid char 
       break;    // and get out of the loop 
      } 
      c=getchar(); 
     } 

     if (is_valid_line) // Only print our result after we finished processing the line. 
     { 
      printf("OK!\n"); 
     } else 
     { 
      printf("ERROR!\n"); 
     } 

     c=getchar();  
    } 

    return 0; 
} 
+0

我想OP想要逐字讀一行字符。 – haccks

+0

我明白了,讓我糾正我的答案。 – nonsensickle

+0

是的,你可以但我沒有downvoted :)。 – haccks

0

這可能是你在找什麼?

讀取一行並處理好/壞字符並打印OK或Error。

#include <stdio.h> 

int main (void ) 
{ 
char buff[1000]; 
char *p = buff ; 
char c ; 
int flgError= 0 ; // Assume no errors 
gets(buff) ; 
printf("You entered '%s'\n", buff); 
while (*p ) // use pointer to scan through each char of line entered 
    { 
    c=*p++ ; // get char and point to next one 
    if ( // Your OK conditions 
     (c>='a' && c<='z') 
     || (c>='A' && c<='Z')  // probably want upper case letter to be OK 
     || (c==','|| c=='.' ||c=='/') 
     || (c==']'||c=='[') 
     || (c=='\n')   // assume linefeed OK 
     ) 
     { 
     // nothing to do since these are OK 
     } 
    else 
     { 
printf ("bad char=%c\n",c); 
     flgError = 1; // 1 or more bad chars 
     } 
    } 

if (flgError) 
    printf ("Error\n"); 
else 
    printf ("OK\n"); 
}