问题描述
我正在从《The C Programming Language》一书中学习 C; 我的问题是关于我在尝试用几行关于输入和输出的代码重新编写时观察到的: 为什么需要给 getchar() 函数一个特定整数的值才能让它存储输入中的所有文本? 例如,使用此代码 putchar() 打印我输入的所有内容;
int c;
while ((c = getchar()) != EOF)
putchar(c)
但是,为什么我写的就不一样了:
while (getchar() != EOF)
putchar(getchar());
在后一种情况下,例如,如果我写“okok”,那么程序就会打印“kk”。
我认为原因在 getchar() 的某些属性内,我无法获得; 例如,如果我编写一个字符计数程序,并且我想排除新行,我还观察到如果我将其编写为:
int nc,c;
nc = 0;
while ((c = getchar()) != EOF)
if (c != '\n')
++nc;
printf("%d",nc);
但是当直接使用 getchar() 而不是 c 整数时,它无法正确区分 '\n':
while ((c = gethar()) != EOF)
if (getchar() != '\n')
++nc;
printf("%d",nc);
我的目的只是为了理解,因为我不想仅仅通过记忆来学习这一点,并且在书中写到 getchar() 使用 int 值工作,所以我想知道是否有什么我尽管阅读了多次,但还是错过了 getchar() 的属性,还在堆栈溢出中搜索了有关 getchar() 主题的不同问题。
解决方法
写作时
while (getchar() != EOF)
putchar(getchar());
总是这样
- 读取一个字符并检查 EOF,
- 读取一个(另一个)字符并打印出来,
- 重复。
因此,在您的“okok”示例中,读取奇数的 'o' 字符,与 EOF
相比并丢弃,只有偶数的 'k' 字符通过。
如果您想打印所有输入字符,则必须重新构造您的代码。例如,要调用一次 getchar()
,将返回值保存到一个变量中,然后使用已经读取的值两次 - 检查 EOF
并打印它。
while (1) { /* loop forever (until break is called) */
int ch = getchar();
if (ch == EOF)
break;
putchar(ch);
}
,
getchar() 函数从输入中获取一个字符并返回它。
while (getchar() != EOF)
putchar(getchar());
您已经使用过两次 getchar() 函数。
对于输入'okok'
'o' 将在 while (getchar() != EOF) 中返回。 'k' 将在 putchar(getchar()) 中返回;
既然你在这里写了 putchar() ,它就会得到字符 'k' 并打印出来。 该过程再次继续并仅打印“k”。 所以输出将是'kk'
要获取值 'okok' 并打印它,请尝试
do
{
char c=getchar();
if(c!=EOF)putchar(c);
}while(c!=EOF);