2016-11-20 101 views
1

我想製作一個只接受來自用戶的小寫字符的程序。 而且我希望它在打印錯誤時,只要有空格,輸入中的大寫字母或字母旁邊的任何字符。 但我的代碼表現出意想不到的方式,我不知道爲什麼。 僅當輸入中輸入的第一個字符是空格或大寫字母時,纔會打印錯誤消息。即使我正在用fgetc掃描整個字符串尋找一個空白字符,它又有什麼可能?檢測輸入中的空格

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

int main (void) 
{ 
    char buff[BUFSIZ]; 
    char ch = fgetc(stdin); 
    if (fgets(buff, sizeof buff, stdin) != NULL && islower(ch)) { 
     while (ch != ' ' && ch != EOF) 
      { 

       printf("There are No Spaces in the input!\n"); 
       return 0; 
      } 
     } 
     printf("Error\n"); 
} 

感謝您的幫助提前

+0

[檢查空白使用'isspace'](http://stackoverflow.com/q/15326729/995714),['fgets'返回'int',而不是'char'](http:// stackoverflow .com/q/8464030/995714),因爲EOF和字符代碼0xFF不同 –

+0

「我想製作一個程序,只接受來自用戶的小寫字符。」和「每當有空白時打印一個錯誤......」 - >>所以你想要「接受」小寫字母和空格等,只需要對它們做不同的事情? – chux

+0

@chux我不想接受空格,我想檢測它們並在輸入時打印錯誤 – SpeedGoat

回答

0

你不掃描整個字符串。你將第一個字符變成ch,然後你將剩下的部分變成buff(或多或少),然後如果ch是小寫字母,你的程序將打印出「沒有空格」因爲你再也不會改變ch。

+2

其他一些注意事項:fgetc返回一個int,而不是char。如果字符被簽名(如在某些計算機體系結構上)並且字符被設置爲最高有效位0x80,則islower在傳遞字符時會行爲不當。 – Waxrat

+0

我如何掃描整個字符串?使用:while(fgetc(stdin)!=''|| fgetc(stdin)!= EOF)?還有什麼替代方法? – SpeedGoat

+0

您需要保存fgetc返回的字符,以便您可以比較幾次。 like:while((ch = fgetc(stdin))!= EOF && ch =='')... islower很好,只要確保聲明ch爲int而不是char。 islower對於從fgetc返回的所有值都有效。 – Waxrat