我从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。
答案 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完美解释的那样。