gpt4 book ai didi

c - scanf中使用[^符号的目的是什么?

转载 作者:行者123 更新时间:2023-11-30 17:21:39 27 4
gpt4 key购买 nike

我遇到了一些代码,想知道原始开发人员在做什么。下面是使用此模式的简化程序:

      #include <stdio.h>

int main() {

char title[80] = "mytitle";
char title2[80] = "mayataiatale";
char mystring[80];

/* hugh ? */
sscanf(title,"%[^a]",mystring);
printf("%s\n",mystring); /* Output is "mytitle" */


/* hugh ? */
sscanf(title2,"%[^a]",mystring); /* Output is "m" */
printf("%s\n",mystring);


return 0;
}

man page for scanf有相关信息,但我无法阅读。使用这种符号的目的是什么?它想要实现什么目标?

最佳答案

字符类的主要原因是 %s 表示法在第一个空白字符处停止,即使您指定了字段长度,但您通常不希望它这样做。在这种情况下,字符类表示法会非常有帮助。

考虑此代码读取最多 10 个字符的行,丢弃多余的内容,但保留空格:

#include <ctype.h>
#include <stdio.h>

int main(void)
{
char buffer[10+1] = "";
int rc;
while ((rc = scanf("%10[^\n]%*[^\n]", buffer)) >= 0)
{
int c = getchar();
printf("rc = %d\n", rc);
if (rc >= 0)
printf("buffer = <<%s>>\n", buffer);
buffer[0] = '\0';
}
printf("rc = %d\n", rc);
return(0);
}

这实际上是与 getline() 变体相关的 comp.lang.c.moderated(大约 2004 年 6 月)讨论的示例代码。

<小时/>

至少存在一些困惑。第一个格式说明符 %10[^\n] 最多读取 10 个非换行符,并将它们与尾随 null 一起分配给缓冲区。第二个格式说明符 %*[^\n] 包含赋值抑制字符 (*),并从输入中读取零个或多个剩余的非换行符。当 scanf() 函数完成时,输入将指向下一个换行符。循环体读取并打印该字符,以便当循环重新启动时,输入将查看下一行的开头。然后重复该过程。如果该行短于 10 个字符,则这些字符将复制到缓冲区,并且“零个或多个非换行符”格式处理零个非换行符。

关于c - scanf中使用[^符号的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28251839/

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