当前位置: 代码迷 >> C语言 >> 大家看看我对scanf()的理解是否正确
  详细解决方案

大家看看我对scanf()的理解是否正确

热度:159   发布时间:2007-03-17 15:23:54.0
大家看看我对scanf()的理解是否正确

Given the input "Go west, young man!", what would each of the following programs produce for output? (The ! follows the space character in the ASCII sequence.)
#include <stdio.h>

int main(void)
{
char ch;

scanf("%c", &ch);

while ( ch != 'g' )
{
printf("%c", ch);
scanf("%c", &ch);
}
return 0;
}
这是c primer plus 5th 上的一个题,当我输入“Go west, young man!”后按回车,输出“Go west, youn”,我的问题不是为何不输出其后的“g man!”,而是为何在输入了所有的字符后按回车却显示了所有的字符(除了后面几个)。
我的理解是,当我输入G后再输入o时,scanf()将G发送给ch,而将o流到下一次的scanf(),简单的比喻一下就是scanf()将o当成了回车,将o前面的G发给ch。为了验证我的想法我有写了下面的程序:
#include <stdio.h>
#include<conio.h>
int main()
{
char ch1,ch2;
scanf("%c",&ch1);
scanf("%c",&ch2);
printf("%c %c",ch1,ch2);
getch();
return 0;
}
输入ab 回车
输出a b

望大家看看我是否理解的正确

搜索更多相关的解决方案: scanf  

----------------解决方案--------------------------------------------------------

不正确
因为你的判断条件是当输入字符不为g时“while ( ch != 'g' )”
所以遇到'g'的时候,跳出while循环


----------------解决方案--------------------------------------------------------
我的问题不在于while ( ch != 'g' ) ,而是关于scanf()的输入特性
----------------解决方案--------------------------------------------------------
我严证过的结果是,先输人o再输入g时,会输出o的,然后跳出循环,如果先输入g的话就直接退出循环!
----------------解决方案--------------------------------------------------------
可能我语文水平不高,真的不是很清楚你在说什么,不过肯定的是,scanf只能按照"%c"和你定义的参数来接收的,例如你的例子,你定了是字符,所以它只能一个一个接收,所以你连续输入两个,只能有一个留在下次咯,这也许就是你所说的scanf特性了吧!
----------------解决方案--------------------------------------------------------
呵呵,看错了
我认为并不是把‘o’当成回车,而是根据你的输入格式读取
不过需要用回车来结束scanf函数,同时把多出的字符放在buff中
下次的scanf就直接从buff中按格式读取

----------------解决方案--------------------------------------------------------
我的问题是关于scanf()的输入特性。
如果回车用来结束scanf(),那当我输入“Go west, youn”后按回车应该是将整个“Go west, youn”语句赋给ch
而题的意思是将字符挨个输给ch,而输入g来结束循环。
----------------解决方案--------------------------------------------------------
以下是引用zhaoyg在2007-3-17 17:40:58的发言:
我的问题是关于scanf()的输入特性。
如果回车用来结束scanf(),那当我输入“Go west, youn”后按回车应该是将整个“Go west, youn”语句赋给ch
而题的意思是将字符挨个输给ch,而输入g来结束循环。

要知道,你的输入格式是%c,所以只能1个1个的读取,但是要输入回车才会开始读取,但是第一次只读取第一个字符
下一次读取时就不用回车,也是按照输入格式从刚才的地方接着读取
----------------解决方案--------------------------------------------------------

以下是引用moonwalker在2007-3-17 17:46:27的发言:

要知道,你的输入格式是%c,所以只能1个1个的读取,但是要输入回车才会开始读取,但是第一次只读取第一个字符
下一次读取时就不用回车,也是按照输入格式从刚才的地方接着读取

但是每读取一个字符都需要回车来读入,而我只按了一次回车,既然能读入所有字符那就说明先前的字符是被后一个字符“挤进”ch的,而最后一个字符的读入是靠回车


----------------解决方案--------------------------------------------------------
以下是引用zhaoyg在2007-3-17 17:57:13的发言:

但是每读取一个字符都需要回车来读入,而我只按了一次回车,既然能读入所有字符那就说明先前的字符是被后一个字符“挤进”ch的,而最后一个字符的读入是靠回车

不是被后一个字符挤的,而是整个字符串一起被回车“挤进”缓冲区,然后scanf依次从缓冲区里按一定格式读取
如果缓冲区里仍有合法的已输入字符,就不会让你再输入,再敲回车了


----------------解决方案--------------------------------------------------------
  相关解决方案