printf调用的输出未在屏幕上显示

时间:2015-12-29 16:46:34

标签: c linux string

我从C和Linux(Ubuntu 14.04)的键盘上得到一个字符串:

char string[STR];    
fgets(string, STR, stdin);

我注意到strlen()无效。

所以,我决定做以下事情:

int i = 0;    
while (string[i] != '\0') {
        printf("\nchar: %c\n", string[i]);
        i++;
}
printf("\nFinished");

我输入"hello"作为输入,输出如下:

char: h

char: e

char: l

char: l

char: o

char: 
永远不会打印

"Finished"

我看不出哪个是问题。我怀疑是因为从键盘读取的输入没有'\0'终止?

昨天我正在使用Windows,并且正在使用字符串。

编辑: STR定义为128。

3 个答案:

答案 0 :(得分:4)

根据您发布的代码段,没有明显的问题。我的猜测是,这是一个更大的程序的一部分,你观察到的是由于输出缓冲。 标准输出流通常是行缓冲的,并将定期刷新(当缓冲区变满时)。

因此,如果\n附加到终端设备,则在printf末尾添加stdout可能会修复它。如果您将其重定向到文件(./a.out >output),那么这也无法修复它。因此,请尝试拨打fflush()

fflush(stdout);

在printf调用之后。

我说"大型节目的一部分"因为在正常进程终止结束时,将刷新所有缓冲的输出。因此,不需要手动冲洗。在异常进程终止时,缓冲输出可能会丢失。

另一种方法是使用sebtuf()完全禁用stdout缓冲:

setbuf(stdout, 0);

答案 1 :(得分:1)

是的。 fgets()存储'\0'作为写入的最后一个字节(可能不是数组中的最后一个位置)。

您需要使用fgets() 中的原型检查<stdio.h> 和大多数函数的返回值。

char x[100]; // unitialized, x[99] may be anything
if (!fgets(x, sizeof x, stdin)) /* error; contents of x are not trustworthy */;
x[strlen(x)] == '\0'; // true, always true
                      // provided the previous statement did not generate an error

答案 2 :(得分:1)

1.如果STR的值小于输入字符串(长度+ 终止字符:'\ 0'),则不会存储输入字符串的最后一个字符在char string[STR];。函数strlen()使用'\0'来确定字符串的结尾,这就是为什么没有它,“不起作用”并且你的程序在无限循环中运行。

2.Buffering可能是另一个原因,正如@ l3x完美解释的那样。