【发布时间】:2014-11-02 08:55:51
【问题描述】:
我有一个如下所示的 C 程序:
#include <stdio.h>
#include <unistd.h>
int main()
{
int n;
char str[16];
scanf("%d", &n);
printf("n: %d\n", n);
int count = read(STDIN_FILENO, str, 16);
printf("str: %s\n", str);
printf("read %d bytes\n", count);
}
如果我使用类似的命令将数据传送到该程序中
(echo -en '45\n'; echo -en 'text\n') | ./程序
只有scanf() 实际读取数据。 read() 只读取 0 个字节。
换句话说,程序输出
n: 45 字符串: 读取 0 个字节
如何将数据通过管道传输到scanf() 和read()?
编辑:对不起,我应该澄清一下:我正在寻找一种方法来做到这一点,而无需修改源代码。感谢无论如何回答和评论的人。
【问题讨论】:
-
您可以先在代码中添加:#include
。 -
需要检查 scanf() 的返回码,以确保该操作实际上将值输入到 'n'。
-
注意:read() 不会在输入的末尾放置一个空字符。所以代码必须这样做,使用 read() 调用的返回值来确定放置空字符的位置。否则,printf 将直接读取实际的 str 内容,直到它(最终)遇到 null char 或导致 seg 错误
-
如果实际上有 16 个或更多字节可供读取,则读取将在 16 个字节处停止,但 str 数组中将没有空间来附加空字节。建议将 str 的大小更改为 17,然后将数组预设为所有空字节。这将确保 str 的内容被正确终止(预先设置所有字节,而不仅仅是最后一个字节)
-
scanf 停在 '\n' 处,而不是要读取的行中的第一个字符。