gpt4 book ai didi

c++ - 对于 scanf(),为什么否定的扫描集 "%[^\n]"显示 "\n"的正确输出,而不是 "%[aeiou]"的扫描集 "aegis"?

转载 作者:行者123 更新时间:2023-11-28 06:00:51 25 4
gpt4 key购买 nike

在下面的程序中,如果我使用否定扫描集的行,如果我输入一个多词行(以 ENTER 或换行符结尾),即使换行符在否定列表中,它也能正常工作。

但是如果我改为使用扫描集的行并输入单词“aegis”(或任何带有辅音的单词),则会输出垃圾字符。类比第一种情况,输入这个词不应该至少输出“ae”吗?请解释 scanf() 的扫描集和否定扫描集的这种行为。

#include <stdio.h>

int main ()
{
char str[30];
printf("Enter the string\n");
//scanf("%[^\n]",str);
//scanf("%[aeiou]",str);
printf("%s",str);
}

最佳答案

是因为代码错误地没有检查scanf()的返回值

printf("Enter the string\n");
scanf("%[^\n]",str);
scanf("%[aeiou]",str); // check result before using `str`
printf("%s",str);

scanf("%[^\n]",str);然后输入 "123\n" , str获取 "123" 的值'\n'留在 stdin 。然后用 scanf("%[aeiou]",str);然后输入 "aegis\n" , 第一行的 '\n'阻止将任何内容保存为 '\n'不是元音,str 中没有保存任何内容由于代码没有检查 scanf() 的返回值, 没有意识到 str可能无效。

1) 始终检查 scanf() 的返回值和家人。

if (scanf(some_format, var1, var2, ...) != ExpectedConversionCount) {
Fail();
}

2) scanf("%[^\n]",str);读取一行会失败 3 件事:没有输入限制,如果该行仅包含 '\n' 则无法读取任何内容.不检查返回值,EOF未检测到。

3) 使用fgets()而不是 scanf()用于用户输入。

关于c++ - 对于 scanf(),为什么否定的扫描集 "%[^\n]"显示 "\n"的正确输出,而不是 "%[aeiou]"的扫描集 "aegis"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33320729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com