我有一个涉及read()命令的快速小问题。
我在C中真的很生气,不幸的是,我现在的作业让我用C编程。 我们需要使用read()而不是fgets等来读取stdin。
所以我有一个简单的while循环:
int n, i;
char buffer[257], *input;
while((n=read(fileno(stdin), buffer, 256)) > 0)
{
buffer[n] ='\0';
if(buffer[n] = '\n') break;
write(input, buffer, strlen(buffer));
}
所以我不确定如何在按下输入(行尾)时停止循环,这就是为什么我有中断代码,虽然我不知道这是否正确完成。
我想要完成的整个目标是将stdin的输入放入指针'input'
(我真的很难理解指针所以请耐心等待:))
我的问题是当我按回车键时出现分段错误。 我希望我可以使用fgets,因为这一切都可以通过一个简单的
来解决input = fgets(buffer, 256, stdin);
Darn homework :( 无论如何,如果你们中的任何一个人能指出我正确的方向,我会非常感激。谢谢!
答案 0 :(得分:2)
你真的错了。首先,write
是用于写入打开文件描述符的系统调用。你的input
不是那样的 - 通过首先调用open
系统调用,或者引用一个始终打开的文件,例如,获得文件描述符。 stdin
,stdout
或stderr
。更不用说文件描述符在Linux上是int
。
此外,您应该记住,您在stdin
上以换行符结尾的输入的假设不一定是正确的。您的程序可能会在标准输入上收到一些不包含任何换行符的内容,例如某些文件的内容(重定向到stdin
),或者键盘输入可能只以Ctrl-D
结尾(EOF)而不是“返回”键。
除此之外,未初始化的指针不会引用任何有效的内存。 char *input
的声明并没有赋予你写{读取input
引用的内存的任何权利,除非你分配了一个这个指针首先指向的内存。
使用<string.h>
中声明的函数实现在C中复制字符串。它们在C字符串上运行,例如由\0
终止的字符序列。在这种情况下,read()
不会以\0
终止其输出,在这种情况下,您将要使用memcpy
函数。你为什么不直接尝试直接阅读input
?首先读取buffer
没有多大意义,只是稍后将数据复制到另一块内存。
此外,read
的规范声明它从文件描述符中读取最多 count 字节。这意味着如果您的buffer
被声明为char[257]
,那么您应该调用read(stdin,buffer,257)
,而不是256.将缓冲区声明为256元素数组可能更合适
我希望我能为你理清一些东西。
答案 1 :(得分:0)
你的input
点不在任何地方有效。您需要分配一些内存(并在完成后释放它)或使其指向有效存储。
=
也是作业; ==
是比较。