在线扫描单个字(C)

时间:2013-12-01 20:45:53

标签: c malloc scanf

我的目标是创建一个程序,从输入中扫描一个单词,然后将其保存为一个大字符串。

我确信输入始终是'\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"

2 个答案:

答案 0 :(得分:0)

每次在while循环中,您都会分配一个新的line,丢弃旧值及其中的字符。除了最后一个字符之外,你永远不会初始化任何东西,所以当你的循环结束时,line是垃圾,除了最后一个字符。您只想在开始时分配足够大的缓冲区ONCE,或使用realloc使缓冲区更大。

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

答案 1 :(得分:0)

我是根据你的回答做出来的。

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;
}