为什么这样不对? 为什么一定要用getchar()函数吗?

int zm=0,sz=0,qt=0;
char c;
scanf("%c",&c);
while(c!='\n')
{
if(c>='0 '&& c <='9')
sz++;
else if((c>='A' && c<='Z') || (c>='a' && c<='z'))
zm++;
else
qt++;
}

printf("%d%d%d",zm,sz,qt);
system("pause");

你现在的程序,只输入了一次 c,while 循环要不进不去、要不就是死循环。肯定是得不到你想要的结果!
scanf 中空格、回车、跳格都表示结束,所以如果 while 中用以上字符判断可能会有问题:得不到这些想要的字符。此时,必须用 getchar().

建议你看看下面的文章:http://wenku.baidu.com/view/e07bf9896529647d27285276.html

用scanf也可以,但是要放在循环里

而且用scanf不能有空格等分隔符

你循环中只会判断c,但是没有跳出循环的条件。一直死笑循环,需要加一个条件来触发break

getchar()会获取到空格回车的。。所以会出错。。。scanf输入空格回车意味着结束。。明白?

你的问题 貌似不是出现在scanf() 或者getchar() 这两个函数上 你程序中的c 是一个char 你用getchar()和scanf() 都是获取 你在键盘上输入的第一个字符 比如你输入的1然后回车 它只会捕捉到1 而后面的换行符会丢失(linux 中的换行符是\n windows 中是\r\n) 这样你的循环根本停不下来。如果你什么都不输入直接回车(换行) 循环有进不去了。。。程序本身有问题。

你需要把缓冲区做一个数组。如果用scanf() 那么就是直接取数组的首地址。如果你非要用getchar()那么需要在一个循环中获取。因为getchar()是获取缓冲区中的每一个字符(用户输入一个,他就读一个)

void
count_num(){
int zm = 0, sz = 0, qt = 0;
char c;
//scanf("%c", &c);
while ((c = getchar()) != EOF && c != '\n')
{
if (c >= '0' && c <= '9')
sz++;
else if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
zm++;
else
qt++;
}
printf("%d%d%d", sz, zm, qt);
system("pause");
}


你写的代码不规矩,没有主函数。scanf()和getchar(),都是可以的。在输入完成敲下回车键的时候,会输入一个‘\n’换行符,所以getchar()或者scanf()也会接收这个换行符,所以要进行判断何时结束,这里采用(c =getchar()) != '\n'来判断

int zm=0,sz=0,qt=0;
char c;
scanf("%c",&c);
while(c!='\n')
{
if(c>='0 '&& c <='9')
sz++;
else if((c>='A' && c<='Z') || (c>='a' && c<='z'))
zm++;
else
qt++;
scanf("%c",&c); //这里再加一句就可以了
}
printf("%d%d%d",zm,sz,qt);
system("pause");

输入字符型函数必须用getchar