在c中读取()stdin?

时间:2012-03-07 22:21:36

标签: c input 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'

(我真的很难理解指针所以请耐心等待:))

我的问题是当我按回车键时出现分段错误。 我希望我可以使用fgets,因为这一切都可以通过一个简单的

来解决
input = fgets(buffer, 256, stdin);

Darn homework :( 无论如何,如果你们中的任何一个人能指出我正确的方向,我会非常感激。谢谢!

2 个答案:

答案 0 :(得分:2)

你真的错了。首先,write是用于写入打开文件描述符的系统调用。你的input不是那样的 - 通过首先调用open系统调用,或者引用一个始终打开的文件,例如,获得文件描述符。 stdinstdoutstderr。更不用说文件描述符在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点不在任何地方有效。您需要分配一些内存(并在完成后释放它)或使其指向有效存储。

=也是作业; ==是比较。