我有一个问题,检查输入字符串的大小与fgets。我想做的是
如果输入的大小大于buf_len则设置"more">
但是我不确定检查输入大小的正确方法是什么。
int read_stdin(char *buf, int buf_len, int *more)
{ // buf = malloc(10), buf_len = 10 , more = 1,
fgets(buf, buf_len, stdin) ;
size_t input_buf_len = strlen(buf);
printf("size of input: %zu n",sizeof(input_buf_len)); // prints 8
printf("buf: %lu n",sizeof(buf)); // prints 8
printf("buf_len:%lu n",sizeof(buf_len)); // prints 4
printf("stdin:%lu n",sizeof(stdin));// prints 8
if (input_buf_len > buf_len)
{
*more = 1;
printf("buf > buf_lenn");
}
*more = 0;
printf("buf < buf_len n");
return sizeof(buf);
}
不管输入长度有多大,可以是1或20,仍然输出与代码中注释相同的数字。
fgets()
读取用户输入,并在读取换行符时停止。它返回:
- 一个指针,指向如果操作成功将被读取的字符串
NULL
失败或遇到EOF
要获得输入大小,首先必须用空终止符替换n
,然后调用strlen()
。这是因为strlen()
在遇到空结束符时停止,但在遇到换行符时不停止:
if (!fgets(buf, buf_len, stdin)) {
// fgets failed...
} else {
buf[strcspn(buf, "n")] = ' ';
size_t input_buf_len = strlen(buf);
printf("Input length: %ld", input_buf_len);
}
fgets
调用读取文本直到换行符,并将换行符包含在读取的文本中。如果fgets
读取的内容没有以换行符结束,这意味着该行还有更多文本要读取。
如果fgets
返回NULL,这意味着它达到了EOF,并且没有读取任何字符。