复制用户输入并将其放在屏幕上

时间:2014-07-15 16:32:33

标签: c compilation printf getchar putchar

我一直在阅读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有一点了解。如果有人可以帮我解决这些问题,那就太棒了。

谢谢!

4 个答案:

答案 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

然后执行:(Li​​nux示例:./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])。以下是它如何分解:

  1. 代码提示您输入数字
  2. 您输入9并按Enter键
  3. 输入流现在包含字符9;
  4. {'9', '\n'}返回输入流中的下一个可用字符,即getchar
  5. '9'不等于'9',因此您打印数字并提示输入下一个字符
  6. EOF返回输入流中的下一个可用字符,即getchar
  7. '\n'不等于'\n',因此您打印字符并提示输入下一个字符
  8. 输入流现在为空,因此EOF会阻止,直到您键入其他内容。
  9. 你可以相对容易地解决这个问题:

    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,则必须执行不同的操作。