我一直在阅读Brian W. Kernighan和Dennis M. Ritchie的C编程语言,并参与字符输入和输出,特别是文件复制。书中的例子
#include <stdio.h>
int main(void)
{
int c;
c = getchar();
while (c != EOF)
{
putchar(c);
c = getchar();
}
return 0;
}
完美无缺。
但我决定对事物进行自我调整并重写一下:
#define <stdio.h>
int main(void)
{
int c;
printf("Please enter a digit: ");
c = getchar();
while (c != EOF)
{
printf("The digit entered was: ");
putchar(c);
printf("Please enter a digit: ");
c = getchar();
}
return 0;
}
编译执行后,我的代码结果为:
Please enter a digit: 9
The digit entered was: 9Please enter a digit: The digit entered was:
Please enter a digit: *cursor is here*
输入应为:
Please enter a digit: 9
The digit entered was: 9
Please enter a digit: *the cursor should be here*
另外,我对EOF有一点了解。如果有人可以帮我解决这些问题,那就太棒了。
谢谢!
答案 0 :(得分:1)
大多数“终端”不会将键盘输入发送到程序“一次按键”。相反,终端将等待回车键,然后将所有按下的键(直到该点)发送到目标程序。因此,问题代码会受到新行\n
作为输入以及数字的影响。
下面的代码会抛弃所有非数字值(但也允许使用EOF值):
#include <stdio.h>
#include <ctype.h>
int main(void)
{
int c;
do {
c=0;
/* Get user input */
printf("Please enter a digit: ");
while(!isdigit(c) && EOF != c)
c = getchar();
/* Produce output. */
if(c == EOF)
printf("\n");
else
printf("The digit entered was: %c\n", c);
} while (c != EOF);
return 0;
}
编译以上内容(Linux GCC示例:gcc -Wall -o test *.c
)
然后执行:(Linux示例:./test
)
Please enter a digit: 5
The digit entered was: 5
Please enter a digit: 6
The digit entered was: 6
Please enter a digit: <CTRL-D>
<CTRL-D>
通常会生成EOF条件。
答案 1 :(得分:0)
因为ENTER值&#34; \ n&#34; (ASCII值10)将通过
获得getchar(c);
所以它会做第二次
printf("The digit entered was: ");
printf("Please enter a digit: ");
答案 2 :(得分:0)
嗯,在将你的作品交给控制台屏幕的过程中,你输入标准输入的新行字符就会出现问题。
我问你这个问题:
使用您所说的代码可以完美地运行,您可能已经尝试了一些输入,例如"Hello!"
,或者可能只是像您的示例中的"9"
这样的单个字符。您已键入'H'
然后'e'
然后'l'
...然后'!'
,然后点击 enter-key ,或只是{{1然后点击 enter-key 。
之后,您的屏幕上显示以下内容:
'9'
最后一个下划线用于指示闪烁的光标。我的问题是:它为什么存在?为什么它不在最后Hello!
Hello!
_
旁边?
与'!'
相同的故事,这就是屏幕上的内容:
9
嗯,原因如下:这是因为你的程序打印了另外一个你无法直接看到的角色,一个换行符9
9
_
。证明:如果没有打印出来,则下划线会在'\n'
或'!'
旁边闪烁。
当您点击 enter-key 时,除了在该会话中到目前为止输入的内容之外,您还需要使用换行符'9'
来提供标准输入。标准输入被所有这些输入,'\n'
逐个消耗它们。
在您的代码中没有按预期工作,您使用getchar();
提供标准输入,'9' '\n'
先获取getchar();
,然后'9'
,然后它寻找更多,但还没有。只有这样(当没有更多的时候)它会向你询问更多。
这就是故事......
为了得到你所期待的,你应该做别的事,我不会直接告诉你,这是一个很好的练习。我可以提示你,你应该在已经拥有的'\n'
循环中使用另一个while
循环,条件检查'\n'
遭遇。
EOF
只是一个特殊字符,或者更确切地说是一个表示存在于文件末尾的特殊情况的值。对于标准输入,我想它可以在Linux上使用CTRL + D
组合键发布,在Windows上为CTRL + Z
。使用该组合,然后点击输入应该让你走出那个外循环。
答案 3 :(得分:0)
你的输入中有一个尾随的换行符被绊倒;当您输入9
并点击Enter
时,您的代码读取的输入流将包含两个字符的编码,{{1和换行符(在ASCII中,它将是值序列[57,10])。以下是它如何分解:
9
并按Enter键9
; {'9', '\n'}
返回输入流中的下一个可用字符,即getchar
'9'
不等于'9'
,因此您打印数字并提示输入下一个字符EOF
返回输入流中的下一个可用字符,即getchar
'\n'
不等于'\n'
,因此您打印字符并提示输入下一个字符EOF
会阻止,直到您键入其他内容。你可以相对容易地解决这个问题:
getchar
最后一个小#include <ctype.h>
...
while (c != EOF)
{
printf("The digit entered was: ");
putchar(c);
printf("Please enter a digit: ");
do
{
c = getchar();
} while ( isspace( c ));
}
循环将从输入流中读取字符,直到它看到不是换行符或其他空格字符。您可以添加额外的检查以确保输入的字符确实是数字[0-9]:
do
现在,要注意一些事情;您在while (c != EOF)
{
printf("The digit entered was: ");
putchar(c);
do
{
printf("Please enter a digit: ");
do
{
c = getchar();
} while ( isspace( c ));
if ( !isdigit( c ))
printf( "%c is not a digit!\n" );
} while ( !isdigit( c ));
}
中存储的内容不是值 c
,而是字符 9
的编码,以ASCII格式编码是整数值57.如果要在'9'
中存储值 9
,则必须执行不同的操作。