请看下面这段C语言代码
printf ("\nEnter the lines (terminate each line with ENTER...\n\n");
for (i = 0; i < lines; i++)
scanf (" %[^\n]", s[i]);
有人告诉我这是使用 scanf() 的危险方法。所以我尝试使用 fgets() 代替......
printf ("\nEnter the lines (terminate each line with ENTER...\n\n");
for (i = 0; i < lines; i++)
fgets(s[i], 999,stdin);
但是,fgets() 比 scanf 读取少一行,其他内容保持不变。例如,如果 rows = 5,则 scanf 读取从 0 到 4 的字符串,即总共 5 个字符串,但是 fgets 只读取 4 个字符串。 为什么会这样?我该如何补救? 预先感谢您。
scanf 的这个调用
scanf (" %[^\n]", s[i]);
不安全,因为没有指定字段宽度。如果示例
sizeof( s[i] )
等于 1000
那么你应该写
scanf (" %999[^\n]", s[i]);
至于
fgets
那么似乎在 for 循环之前您输入了一些内容,例如变量 lines
的值。在这种情况下,输入缓冲区包含调用 scanf 后存储在那里的新行字符,并且第一次调用 fgets 读取一个空字符串。
调用scaff时不存在这样的问题,因为格式字符串中的前导空格
scanf (" %[^\n]", s[i]);
^^
允许跳过输入缓冲区中的前导空白字符。