2016-11-20 94 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