c - 为什么这个程序的输出中多了一个 "*"?

标签 c io output getchar putchar

#include <stdio.h>

int main () 
{ 
  int c; 
  while ((c = getchar ()) != EOF) 
    { 
      putchar (c); 
      printf ("*"); 
    }


  return 0; 
}

当我运行这个程序时,我得到的输出如下

qwerty                                          

q * w * e * r * t * y *
* 

#我不明白最后一个“*”是如何打印的。

putchar()的返回有关。那么 putchar() 函数实际上是如何返回的。我知道它在达到 EOF 后返回,因此在这种情况下,它不会打印任何内容,并且 printf("*") 将被执行。但问题是,为什么最后一个 * 会在下一行中打印。是不是像 putchar() 返回并将打印指针移动到新行?

我克服这个疑问的一个理论是,如果我在输入后不按“回车”,则不会打印 * 。但它再次产生了一个问题,即如何在不按 Enter 的情况下获得输出(在给出输入后)?为什么最后一个 * 是由于按“enter”键而出现的?

最佳答案

当您输入“qwerty”并按 Enter 键时,新行字符 \n 会附加到输入中。因此,程序的输入将是:

"qwerty\n"
       ^^

当循环处理最后一个(换行)字符时,即打印的 \n 字符,它实际上将光标移动到下一行,并在其后打印最后一个星号。

为了不随输入一起获取尾随换行符,您可以在 while 循环条件中添加对换行符的检查:

while ((c = getchar ()) != EOF && c != '\n')

或者,您可以在输入后给出文件结束EOF字符,而不是按回车键。对于 EOF,在 Unix 上按 Control+D,在 Windows 上按 Control+Z

关于c - 为什么这个程序的输出中多了一个 "*"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51454979/

相关文章:

c - 当我分配给下一张卡片时,为什么指针在 main 函数中没有最后改变?

c - 读入数字直到遇到换行符

c# - 字符串替换未按预期工作

c - 使用 fchmod 比使用 chmod 更好吗?

c - 负数右移

c - 将 unsigned int 转换为 float 时出错

java - 从输入文件读取时出现新行,即使\n 是定界的

c++ - "Optimal"IO 缓冲 - 程序员 's or Kernel' s 任务?

php - 从 url 中获取元描述、标题和图像,如 facebook 链接共享

java - BufferedWriter 不生成文件输出