【问题标题】:Custom getline() Implementation - for inside a while loop自定义 getline() 实现 - for 在 while 循环内
【发布时间】:2016-10-17 22:56:50
【问题描述】:

问题空间:

while ((len = _getline(line, MAXLEN)) > 0) 如何使_getline(...) 内的i 递增但直到按下enter key 才打印结果?

代码示例:

#include <stdio.h>
#include <string.h>

#define MAXLEN 1000

int _getline(char s[], int max)
{
    int c, i, l;

    for (i = 0, l = 0; (c = getchar()) != EOF && c != '\n'; ++i) {

        printf("%d\n", i);

        if (i < max - 1) {
            s[l++] = c;
        }
    }

    if (c == '\n' && l < max - 1)
        s[l++] = c;

    s[l] = '\0';
    return l;
}

int main()
{
    int len;
    char line[MAXLEN];

    while ((len = _getline(line, MAXLEN)) > 0)
        ;

    return 0;
}

【问题讨论】:

  • 可能是因为c != '\n'for loop里面,不然for loop会在内部继续执行,直到c != '\n'不满足,这时程序会转到下一行?跨度>
  • 为什么自定义的getline 会在达到max 后继续读取字符?
  • 在文件级别,以下划线开头的名称保留用于实现。应用程序代码不得使用它们。
  • 顺便说一下——键盘输入是缓冲的。在您按 Enter 之前,操作系统根本不会向您的程序发送任何内容。我不确定您期望会发生什么,但您的代码会按照我的预期运行。
  • @JohnColeman 抱歉,我忘记检查了,但是代码应该按原样工作,我只是想知道为什么 printf() 不调用它,而 while ((len = _getline(line, MAXLEN)) &gt; 0) 正在调用它。

标签: c arrays c-strings getchar


【解决方案1】:

怎么回事……(各种事情都没有发生)但直到按下回车键才打印结果?

来自stdin 的典型输入是行缓冲@John Coleman

没有任何东西可用于getchar()它会一直等待,直到按下 Enter'\n',或者缓冲区填充(可能是 4k 个字符),或者出现 EOF - 然后它返回第一个字符。对getchar() 的后续调用可能会使用缓冲的线路输入快速返回。

缓冲行为取决于实现。它不是由 C 指定的。

【讨论】:

  • 还有一个愚蠢的问题,在我们输入时,_getline() 上的for() loop 是否会在内部循环,还是只是在getchar() 上等待一次,直到我们按下回车键并循环所有内容。我想我明白了,for loop 只是等待getchar() 直到按下回车键?
  • @dud3 for 循环与 I/O 无关。 getchar() 等到它有来自 stdin 的一些输入,然后返回。由于stdin 通常是行缓冲,这意味着第一个getchar() 调用等待,直到用户键入"12\n",然后返回'1'。下一个调用,getchar() 立即返回'2',下一个调用,getchar() 立即返回'\n',下一个调用,getchar() 等到用户输入"34\n",然后返回'3'...
猜你喜欢
  • 2014-02-15
  • 2021-10-28
  • 2019-11-10
  • 2015-12-24
  • 2018-11-05
  • 2017-03-29
  • 2017-04-29
  • 1970-01-01
  • 2014-03-22
相关资源
最近更新 更多