gpt4 book ai didi

c - scanf语句中这些符号的使用是什么意思?

转载 作者:行者123 更新时间:2023-12-03 07:51:30 25 4
gpt4 key购买 nike

问题出在第四个scanf。请帮助我理解 scanf("%[^\n]%*c", c) 的用法。

    char a;
char b[30];
char c[50];

scanf("%c", &a);
scanf("%s", b);
scanf("\n");

scanf("%[^\n]%*c", c);

printf("%c \n", a);
printf("%s \n", b);
printf("%s \n", c);
return 0;

最佳答案

%[ 匹配在其字符集中找到的任何字符。 ] 终止集合。

  • 例如输入hello world%[ehlo]匹配hello,遇到未找到的空格则停止在集合中。

^ 开始该集合反转匹配,匹配该集合中找到的任何字符。

效果:%[^\n] 匹配尽可能多的字符,这些字符不是换行符。

%c 匹配任何字符。添加 *(如 %*c)可防止 scanf 将该字符分配给任何变量。

总体效果是 "%[^\n]%*c" 读取尽可能多的字符,并将这些字符存储在缓冲区中,直到到达换行符。然后它消耗并丢弃换行符。实际上,它读取一行文本。


请注意,在使用%[(或%s)时不指定最大字段宽度会使您的程序容易发生缓冲区溢出(与 using gets() 相同的问题)。

避免潜在的undefined behaviour ,您应该始终提供要读取的最大字符数

char c[50];
scanf("%49[^\n]%*c", c);

最多应为缓冲区大小减一(为空终止字节 '\0' 留出空间)。

在此特定示例中,如果输入的字符串超过 49 个字符,您将遇到数据丢失,因为 %*c 将消耗除换行符之外的其他内容。

出于这些原因,通常建议改用 fgets当您想要阅读一行文本时,因为您可以更轻松地检测过大的行。

关于c - scanf语句中这些符号的使用是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76978462/

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