gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:18:54 24 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 个非换行符,并将它们分配给缓冲区,以及尾随的空值。第二个格式说明符 %*[^\n] 包含赋值抑制字符 (*) 并从输入中读取零个或多个剩余的非换行符。当 scanf() 函数完成时,输入指向下一个换行符。循环体读取并打印该字符,这样当循环重新开始时,输入会查看下一行的开头。然后重复该过程。如果该行短于 10 个字符,则将这些字符复制到缓冲区,并且“零个或多个非换行符”格式处理零个非换行符。

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

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