您可能应该查看的函数是 fgets。至少在我的系统上,定义如下:
char *fgets(char * restrict str, int size, FILE * restrict stream);
所以一个非常简单的从键盘读取输入的程序会运行如下:
#include <stdio.h>
#include <stdlib.h>
#define MAXSTRINGSIZE 128
int main(void)
{
char array[2][MAXSTRINGSIZE];
int i;
void *result;
for (i = 0; i < 2; i++)
{
printf("Input String %d: ", i);
result = fgets(&array[i][0], MAXSTRINGSIZE, stdin);
if (result == NULL) exit(1);
}
printf("String 1: %s\nString 2: %s\n", &array[0][0], &array[1][0]);
exit(0);
}
这可以在我的系统上正确编译和运行。 fgets 的唯一问题是在字符串中保留换行符 \n 。因此,如果您不想这样做,则需要将其删除。至于 *FILE 参数,stdin 是一个预定义的 *FILE 结构,表示标准输入或文件描述符 0。还有用于标准输出(文件描述符 1)的 stdout 和用于错误消息和诊断的 stderr(文件描述符 2)。文件描述符编号对应于 shell 中使用的编号,如下所示:
$$$-> cat somefile > someotherfile 2>&1
这样做是取出文件描述符 2 的 outfile 并将其重定向到 1,然后将 1 重定向到文件。此外,我正在使用 & 运算符,因为我们正在寻址数组的一部分,并且有问题的函数(fgets、printf)需要指针。至于结果,gets 和 fgets 的手册页说明如下:
返回值
成功完成后, fgets() 和 gets() 返回一个指向字符串的指针。如果在读取任何字符之前出现文件结束,
它们返回 NULL 并且缓冲区内容保持不变。如果
发生错误,它们返回 NULL 并且缓冲区内容为
不定。 fgets() 和 gets() 函数不区分
在文件结束和错误之间,调用者必须使用 feof(3) 和
ferror(3) 来确定发生了什么。
因此,为了使您的代码更加健壮,如果您得到一个 NULL 结果,您需要使用 ferror 检查错误或使用 feof 检查文件结尾并做出适当的响应。此外,永远不要EVER 使用gets。您可以安全使用它的唯一方法是您必须具有预见未来的能力,显然没有人可以做到,因此无法安全使用它。它只会让你面临缓冲区溢出攻击。