【问题标题】:Scan single word on line (C)在线扫描单个单词 (C)
【发布时间】:2013-12-01 20:45:52
【问题描述】:

我的目标是制作一个程序,它可以从输入中扫描一个单词,然后将其保存到一个大字符串中。

我确定输入总是单词'\n' 单词'\n' ...

所以我试图扫描单个字符并将其保存到一个数组中,并将'\n' 替换为' '

我的代码:

char c;
char *line;
int len = 0;

while(!feof(stdin))
{
    len++;
    char *line = (char *)malloc(sizeof(char) * len);
    scanf("%c", &c);
    if (c == '\n')
        line[len - 1] = ' ';
    else
        line[len - 1] = c;
}

int q;
for(q = 0; q < len - 1; q++)
    printf("%c", line[q]);

输出错误。 (RUN FAILED (exit value 1, total time: 2s)

例如我想要输入:

one
two
three
four
five

这个用于输出:

"one two three four five"

【问题讨论】:

  • 请提供更多详细信息,了解您作为输出收到的确切错误。
  • 诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺诺。只留下可怜的scanf()。你不需要它。你不想使用它。您需要健全、安全、易于使用的功能,例如getchar()fgets()。您也绝对不想转换 malloc() 的返回值。

标签: c malloc scanf


【解决方案1】:

每次在您的 while 循环中,您分配一个新的 line,丢弃旧值和其中的字符。除了最后一个字符之外,您永远不会初始化任何内容,因此当您的循环完成时,line 是垃圾,除了最后一个字符。您只想在开始时分配一个足够大的缓冲区 ONCE,或使用realloc 使缓冲区更大。

您有while(feof(stdin)),这几乎总是错误的——feof 只有在未能从输入中读取字符后才为真。所以你最终会循环一个太多次,复制最后一个字符。请检查 scanf 的返回值。

【讨论】:

    【解决方案2】:

    我是根据你的回答做出这个的。

    char c;
    char *line;
    int len = 0;
    
    while (scanf("%c", &c) != EOF) {
        len++;
        line = (char *) realloc(line, sizeof (char) * len);
        if (c == '\n')
            line[len - 1] = ' ';
        else
            line[len - 1] = c;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-03-27
      • 2014-05-06
      • 1970-01-01
      • 2015-01-18
      • 2023-04-02
      • 2019-04-14
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多