在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或引用其中一个始终打开的文件(例如stdinstdoutstderr来获取文件描述符。 更不用说文件描述符是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指向任何有效的地方。 您需要分配一些内存(并在完成后释放它)或使其指向有效存储。

另外=是分配; ==是比较。