当前位置: 首页 > 知识库问答 >
问题:

理解C语言字符计数程序中的getchar()

邵城
2023-03-14

这是我上一个问题的后续问题。已经有一个类似的问题(问题)。但我从这个答案中没有得到我想知道的东西。

从上一个问题中,我知道如果我键入很多字符,那么它们将无法用于 getchar(),直到我按 Enter 键。因此,在我按 Enter 键的那一刻,所有字符都将可用于 getchar()。现在考虑以下字符计数程序:

#include<stdio.h>
main()
{
  long nc;
  nc=0;
  while(getchar()!=EOF)
  ++nc;
  printf("    Number of chars are %ld ",nc);
}

如果我按照以下顺序从命令行输入字符:{1,2,3,^Z,4,5,回车},然后在下一行{^Z,回车}。我期望的输出是:字符数为6。但是我得到的输出是字符数为4

这个答案解释了当我们input1,2,3,^Z时,那么^Z的行为就像< code>Enter并且1,2,3被发送到getchar()s .上面写的代码的while循环运行三次。^Z没有给getchar(),所以程序还没有终止。我的输入是{1,2,3,^Z,4,5,Enter}.在^Z之后,我按了4,5,然后回车。现在,当我按Enter键时,字符4,5和Enter,应该被赋予getchar()s,而while循环应该执行三次以上。然后在最后一行输入{^Z,Enter},因为^Z后面没有文本,它被认为是一个字符,当我按Enter时,这个^Z被作为getchar()的输入,while循环终止。在所有这些中,while循环已经执行了6次,所以变量< code>nc应该变成< code>6。

    < li >为什么< code>nc的值是< code>4,而不是< code>6。

共有2个答案

任元青
2023-03-14

^Z 或 Ctrl-Z 表示文本文件(旧 MS-DOS)的文件结尾。getchar() 等价于 fgetc(stdin),通常是一个宏。“fgetc 返回读取为 int 的字符或返回 EOF 以指示错误或文件结束。”

但是,我不确定这是否会立即改变行为,或者你是否必须关闭/重新打开文件。也不确定是否可以关闭/重新打开stdin(不要再做太多的控制台编程)。

壤驷彦
2023-03-14

添加一些输出将帮助您:

#include <stdio.h>
int
main (void)
{
  int c, nc = 0;
  while ((c = getchar ()) != EOF)
    {
      ++nc;
      printf ("Character read: %02x\n", (unsigned) c);
    }
  printf ("Number of chars: %d\n", nc);
}

Windows控制台将^Z输入视为“将^Z之前的输入发送到stdin,丢弃行上的剩余输入(包括行尾分隔符),并发送^ Z>”,除非它位于行的开头,在这种情况下,它将发送EOF而不是^2

123^Z45
Character read: 31
Character read: 32
Character read: 33
Character read: 1a
^Z12345
Number of chars: 4

此外,Windows始终等待Enter键/Return键,只有极少数键序列例外,如^C^{Break}

 类似资料:
  • 对于一个开发者而言,能够胜任系统中任意一个模块的开发是其核心价值的体现。 对于一个架构师而言,掌握各种语言的优势并可以运用到系统中,由此简化系统的开发,是其架构生涯的第一步。 对于一个开发团队而言,能在短期内开发出用户满意的软件系统是起核心竞争力的体现。 每一个程序员都不能固步自封,要多接触新的行业,新的技术领域,突破自我。

  • 本文向大家介绍详解C语言中的字符串数组,包括了详解C语言中的字符串数组的使用技巧和注意事项,需要的朋友参考一下 在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小。第二种没有字符串的大小限制。 总结 以上所述是小编给大家介绍的C语言中的字符串数组,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回

  • 主要内容:字符串连接函数 strcat(),字符串复制函数 strcpy(),字符串比较函数 strcmp()C语言提供了丰富的字符串处理函数,可以对字符串进行输入、输出、合并、修改、比较、转换、复制、搜索等操作,使用这些现成的函数可以大大减轻我们的编程负担。 用于输入输出的字符串函数,例如 、 、 、 等,使用时要包含头文件 ,而使用其它字符串函数要包含头文件 。 是一个专门用来处理字符串的头文件,它包含了很多字符串处理函数,由于篇幅限制,本节只能讲解几个常用的,有兴趣的读者请 猛击这里查阅所

  • 本文向大家介绍C语言解数独程序的源码,包括了C语言解数独程序的源码的使用技巧和注意事项,需要的朋友参考一下 用C语言写的解数独的程序。在linux下测试成功运行。 效果如图: 这是带解的数独,需要填写的部分用数字0代替。 这是程序运行后的效果图。看看,数独已经搞定啦。 程序源码如下: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 以下节目旨在复制一个基本的酒店客房预订方案。创建hotel number的实例后,通过调用checkIn()方法,程序检查是否有可用的房间,如果有,则保留房间。 但是,如果在分配完所有房间后,有人从一个房间(通过方法)退房,例如1号房间,然后试图入住该房间,则该方法无效。当调用hasRoomsAvailable()方法时会出现此问题,在这种情况下,由于currentRoomNumber是5,该方法

  • C 语言中的字符串虽然不是一种独立的数据类型,但是这并不影响其重要地位,所以在 C 语言中会有一些专门针对字符串的函数。 1. 字符串函数 字符串函数是专门用来进行字符串操作的。C 语言提供了一个标准的函数库 string.h 。在这个函数库中大致存在了 22 个字符串的函数。我们这里所介绍的字符串函数是来自于这个标准函数库中比较常用的的一部分函数。除了这个函数库,还会有第三方的函数库提供的字符串