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

getchar()和enter按钮了解它的实际工作原理

米景辉
2023-03-14

我写了下面的函数(当我读里奇关于C的书时),从命令行获取一行。它做了它应该做的事情,我理解它是如何工作的,但我想深入一点。

int getLine(char arr[], int max) {
    int c, i;
    for (i = 0; i < max - 1 && (c = getchar())!= EOF && c!= '\n'; ++i) {
        arr[i] = c;
    }
    if(c == '\n') {
        arr[i] = c;
    }
    arr[i+1] = '\0';
    return i; /*length without '\n'*/
}

我的问题是关于循环的,假设我们有一个空白命令行,它正在等待用户输入内容,因为第一个getchar()在循环中被调用,假设用户输入了以下内容:

h

我猜接下来会发生什么,是getchar()在arr[]中存储“h”,而用户实际上没有按回车键。

因此如果用户继续键入:

hello

'h''e''l''l'和'o'将存储在arr[]中,而用户实际上没有按下回车键,getchar将被调用总共6次,最后一次是在'o'之后。然后当用户按下回车键时,getchar()将在arr[]中存储'\n',我说得对吗?这就是它的工作原理吗?所以我想问题是

getchar() 需要输入才能执行它所做的事情吗?

谢谢

共有1个答案

赵高韵
2023-03-14

getchar()在刷新输入之前不会返回任何内容,为此,您必须在linux终端上按Enter/return或插入EOF,这是通过按CtrlD实现的,而windows控制台 执行此操作。<="">

 类似资料:
  • 我未能弄清楚Spark SQL join操作实际上是如何工作的。我读过相当多的解释,但它没有给一些问题带来光明。 例如,您有两个以Spark(parquet或任何其他格式)保存的数据库表。您必须根据一些列加入它们: 我将以的形式启动该查询 null 现在我必须连接大约50对巨大的表,它们中的每一个都应该被分成多个块(子集),比如说5个块。因此,我将获得块之间的筛选和联接操作,而不是

  • 我知道如何禁用按钮,以防止它被点击两次。然而,如果我想再次启用它,只要它安全,我可以做类似的事情,我调用setenabled(true)在onclick??是一调用setenabled(false)就禁用按钮,还是只在onclick函数完成时禁用?

  • 此指令可与锁前缀一起使用,以允许指令原子执行。为了简化与处理器总线的接口,目的操作数接收一个写周期,而不考虑比较的结果。如果比较失败,则写回目标操作数;否则,将源操作数写入目标。 我很难理解最后一句(但可能也很难理解整个图表) 写回什么? 源操作数是什么?是吗?据我所知,这个CAS指令只接受一个操作数(内存目标)。 如果有人能重新措辞和/或解释关于无条件写入的这一点,我将不胜感激。

  • 我使用的是systemd服务,它在进程“启动”时调用进程(例如,systemctl start test.service)。根据设计,进程永远处于循环中,我们可以使用“ps”命令看到进程的存在。我们还看到,对于systemctl stop命令,进程正在被终止(如预期的那样)。然而,我们的要求是,在进程被杀死之前,我们希望在进程内执行一些安全的关闭操作。但我不知道如何从过程中检测到系统停止操作。 执

  • 本文向大家介绍深入了解Java GC的工作原理,包括了深入了解Java GC的工作原理的使用技巧和注意事项,需要的朋友参考一下 JVM学习笔记之JVM内存管理和JVM垃圾回收的概念,JVM内存结构由堆、栈、本地方法栈、方法区等部分组成,另外JVM分别对新生代下载地址  和旧生代采用不同的垃圾回收机制。 首先来看一下JVM内存结构,它是由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示。 JVM

  • 正如标题所解释的,我有一个非常基本的编程问题,但我还没有找到。过滤掉所有(非常聪明的)“为了理解递归,你必须首先理解递归。”各种在线线程的回复我仍然不太明白。 当我们面对不知道自己不知道的事情时,我们可能会提出错误的问题或错误地提出正确的问题。我将分享我的“想法”。我的问题是希望有类似观点的人能够分享一些知识,帮助我打开递归灯泡! 以下是函数(语法用Swift编写): 我们将使用2和5作为参数: