我正在编写一个小套接字程序(GNU libc)。我有一个循环,要求用户输入(例如" MSG>")。当用户按Enter键时,将发送消息(当前发送到localhost上的服务器)。
无论如何,我想从stdin读入char缓冲区[256]。我目前正在使用fgets(),它没有做我想做的事情。我不确定如何编写代码,以便我询问用户,然后一次获取256个字节的数据,这样我就可以通过256个字节的几个字符串发送一个1000字节的c字符串。
编辑:添加代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 256
int main(int argc, char *argv[])
{
char msg[BUFSIZE];
size_t msgLen;
msgLen = strlen(fgets(msg, BUFSIZE, stdin));
puts(msg);
// This simply checks whether we managed to fill the buffer and tries to get
// more input
while (msgLen == (BUFSIZE - 1))
{
memset (msg, '\0', BUFSIZE);
fread(msg, BUFSIZE, 1, stdin);
msg[BUFSIZE - 1] = '\0';
msgLen = strlen(msg);
puts(msg);
if (msgLen < (BUFSIZE - 1))
break;
}
return 0;
}
答案 0 :(得分:2)
您正在实现一个循环以确保收到1000个字节,对吗?为了易读性,循环应该表明它计数到1000。跟踪您读取的字节数(使用+ =运算符),并在循环条件中使用该数字。
您似乎假设fread
将读取255个字节,但这是在255个字节可用的无效假设下。当读取少于255个字节时,这不一定表示错误;继续阅读!当fread
的返回值小于零时,您应该担心。确保你处理这些情况。
答案 1 :(得分:1)
您可以考虑将read
函数用于缓冲输入。它需要一个打开的文件描述符(stdin的STDIN_FILENO),一个指向缓冲区(char *
)的指针和要读取的字节数。有关详细信息,请参阅手册entry。
答案 2 :(得分:1)
这个怎么样:
fread(buffer, sizeof(buffer), 1, stdin);
答案 3 :(得分:1)
如果您正在使用fgets()
,那么您正在使用标准IO库。您将要使用fread()
然后(而不是使用文件描述符的read()
)来指定要读取的字节数。请参阅:http://www.cplusplus.com/reference/cstdio/fread/