在c中读取()stdin?
我有一个涉及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’
(我真的很难理解指针,所以请耐心:))
我的问题是当我按Enter键时出现分段错误。 我希望我可以使用fgets,因为这一切都可以通过一个简单的解决
input = fgets(buffer, 256, stdin);
做作业:(不管怎样,如果你们中的任何一个人能指出我正确的方向,我会非常感激。谢谢!
你这一切都错了。 首先, write
是一个用于写入打开文件描述符的系统调用。 您的input
与此类似 – 通过首先调用open
syscall或引用其中一个始终打开的文件(例如stdin
, stdout
或stderr
来获取文件描述符。 更不用说文件描述符是Linux上的int
。
此外,您应该记住,以stdin
换结尾的stdin
输入的假设不一定是正确的。 您的程序可能会在标准输入上收到一些不包含任何换行符的内容,例如某些文件的内容(重定向到stdin
),或者键盘输入可能只是以Ctrl-D
(EOF)而不是“返回”结束“关键。
最重要的是, 未初始化的指针不引用任何有效的内存 。 char *input
的声明不赋予您写入/读取input
引用的内存的权利,除非您分配一些该指针将指向的内存。
在C中复制字符串是通过使用
声明的函数实现的。 它们对C字符串进行操作,例如以\0
结尾的字符序列。 在这种情况下, read()
不会以\0
结束其输出,在这种情况下,您将要使用memcpy
函数。 你为什么不直接尝试直接阅读input
? 首先读取buffer
没有多大意义,只是稍后将数据复制到另一块内存中。
此外, read
的规范说明它从文件描述符中读取计数字节。 这意味着如果你的buffer
被声明为char[257]
,那么你应该调用read(stdin,buffer,257)
,而不是256.它可能更适合简单地将缓冲区声明为256元素数组。
我希望我能为你理清一些东西。
你的input
指向任何有效的地方。 您需要分配一些内存(并在完成后释放它)或使其指向有效存储。
另外=
是分配; ==
是比较。