【问题标题】:C: how to read many strings from stdinC:如何从标准输入读取许多字符串
【发布时间】:2018-09-01 11:10:20
【问题描述】:

我需要读取许多长度可变的字符串,从标准输入到 EOF。 字符串由连续的字符组成,没有空格分隔,并且没有字符串的最大长度。

使用:

char st[101];
while(scanf("%100s",st) != EOF){ //divide the input into parts of 100 chars
    int i;
    for(i=0; i<strlen(st);i++){
        printf("%c",st[i]);
    }
}

我无法判断当前字符串是前一个字符串的一部分还是新字符串的一部分,因为它全部打印在一行中(而且我不知道在哪里打印“\n”)。

样本输入

aaaaaaaaa[...]aaaaa

bbbbbbbbb[...]bbbbb

输出

aaaa[...]aabbbbbb[...]bbbb

有什么办法吗?

附:使用 getchar() 我无法处理 EOF。

【问题讨论】:

  • 字符串是如何分开的?
  • 你是什么意思,你“不能处理 EOF”?为什么不呢?
  • 请提供示例输入和预期输出。
  • 那就用getline():linux.die.net/man/3/getline
  • 你在自相矛盾。您写了“它全部打印在一行中”,然后在评论中您写了“每行有一个字符串”

标签: c scanf stdin eof


【解决方案1】:

以下是使用getchar 处理EOF 的方法:

int c;
while ((c = getchar()) != EOF) {
    putchar(c);
}

此代码将在标准输出上复制其输入。

如果您想一次处理整行,最简单的方法是使用getline(如果有的话)(它是 POSIX,而不是标准 C):

char *line = NULL;
size_t size = 0;

ssize_t nread;
while ((nread = getline(&line, &size, stdin)) != -1) {
    // nread characters were read
    do_stuff_with(line);
}
free(line);

如果您没有getline,您可以自己编写(使用getcharrealloc)。

【讨论】:

  • 我只能使用C标准库(libc)
  • @Mr.WhiteBear 那么我的答案的最后一句话适用(但请注意,getline 在 libc 中,它包含的内容比 C 标准库多得多,而且少得多(sqrt 和朋友是通常在 libm 中,而不是 libc))。
  • 完美。感谢您的帮助
  • 我刚刚知道我不能使用 getline()。如何使用 fgets() 处理我的问题?
猜你喜欢
  • 2021-06-19
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 2012-07-21
  • 2015-10-11
  • 1970-01-01
相关资源
最近更新 更多