【问题标题】:How can I read an unlimited string until EOF and put them a char array in C?如何在 EOF 之前读取无限的字符串并将它们放在 C 中的 char 数组中?
【发布时间】:2015-03-17 14:37:48
【问题描述】:

例如,用户输入了 3 行条目,我想将它们拆分为一个单词并将它们存储在 char 数组中。

条目:

  Banana apple kiwi cherry\n
  horse car blue jacket\n
  bla bla bla  ^d

条目可能包含更多或更少的行。我不知道条目中有多少字。我只知道条目以 EOF 结尾,我需要将所有单词存储在一个数组中。你能帮帮我吗?

【问题讨论】:

  • 欢迎来到 Stack Overflow!请拨打tour 并阅读How to Ask,了解我们对问题的期望。请注意,我们这里不提供从头开始编码服务。 :-)
  • 如果需要,您可以使用getc() 读取一个字符并使用realloc() 分配更多内存。
  • 我是 c 初学者,我不知道该怎么做 :(

标签: c arrays


【解决方案1】:
#include <stdio.h>
#include <stdlib.h>


int main(){
    char *big=malloc(256);
    int c; long n=0,t=255;
    printf("Enter something very long: ");
    while ((c=getchar())!=EOF) {
        if (n>=t) {
            big=realloc(big,t+256);
            t+=256;
        }
        big[n]=c; ++n;
    }
    big[n]='\0';
    puts(big); // using puts as it's faster than printf
    // or printf("%s",big);
    free(big);
    return 0;
}

这对我有用。

【讨论】:

  • 不是我的反对票,但有一些问题。它应该是int c;,因为getchar() 返回一个int,而不是char。您需要从realloc() 捕获返回值。您没有使用realloc() 分配更多空间——第二个参数是新大小,而不是大小的增量。您可能应该使用big[n] 而不是*(big+n)。使用puts() 意味着与输入相比,您在输出中会得到一个额外的换行符。通常每行只有一个语句会更好。为什么不在它的声明中初始化n——就像你做t一样? realloc() 的错误处理很糟糕!
  • 更好,但realloc() 应该是big = realloc(big, t + 256); t += 256;
  • 谢谢大家,我一直在匆忙写这篇文章。这对我有用,也许编译器喝醉了,谁知道呢。
  • @JonathanLeffler ,big=realloc(big,t+=256); 不是更好吗?
  • @CoolGuy:排序,但如果您错误检查分配,则不会,这尚未讨论。还有应该讨论的ptr = realloc(ptr, size) 错误模式。是的,t += 256 可以。不过,这不是我写它的方式。我计算一个新的大小,尝试分配它,只有当分配成功时,我才将分配内存的当前大小设置为新大小(同时将当前指针设置为新指针)。是的,如果需要,您可以通过在失败后减小大小来从增加的大小中恢复。
猜你喜欢
  • 2020-03-29
  • 2020-05-04
  • 2018-09-02
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
相关资源
最近更新 更多