scanf 与 fgets 的行为

问题描述 投票:0回答:1

请看下面这段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 个字符串。 为什么会这样?我该如何补救? 预先感谢您。

c scanf fgets
1个回答
0
投票

scanf 的这个调用

scanf (" %[^\n]", s[i]);

不安全,因为没有指定字段宽度。如果示例

sizeof( s[i] )
等于
1000
那么你应该写

scanf (" %999[^\n]", s[i]);

至于

fgets
那么似乎在 for 循环之前您输入了一些内容,例如变量
lines
的值。在这种情况下,输入缓冲区包含调用 scanf 后存储在那里的新行字符,并且第一次调用 fgets 读取一个空字符串。

调用scaff时不存在这样的问题,因为格式字符串中的前导空格

scanf (" %[^\n]", s[i]);
       ^^

允许跳过输入缓冲区中的前导空白字符。

© www.soinside.com 2019 - 2024. All rights reserved.