什么是使用[^在scanf符号的目的是什么?
-
12-09-2019 - |
题
我遇到了一些代码,想知道什么原开发商达。下面是使用这种模式的简化程序:
#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;
}
href="https://linux.die.net/man/3/scanf" rel="nofollow noreferrer">手册页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);
}
这实际上是要讨论的示例代码上comp.lang.c.moderated(大约2004年6月),以getline()
变体相关。
至少一些混乱统治。第一格式说明,%10[^\n]
,读取多达10个非换行字符和它们被分配到缓冲,后面带有一个空沿。所述第二格式说明,%*[^\n]
包含分配抑制字符(*
),并读取零个或多个剩余的从输入非换行符。当scanf()
功能完成后,输入下一个换行符指出。在循环体中读取并打印字符,因此,当循环重新开始,输入被看下一行的开始。然后该过程重复。如果该行是超过10个字符短,则这些字符被复制到缓冲器,而“零个或多个非换行符”格式来处理零非换行。
其他提示
像%[a]
和%[^a]
的构建体存在,使得scanf()
可以用作一种词法分析器。这些都是有点像%s
,但不是收集尽可能多的“粘性”的字符尽可能的跨度,由字符类描述他们只是收集字符的跨度。可能有情况下,书写%[a-zA-Z0-9]
可能是有意义的,但我不知道我看到的互补班,scanf()
一个引人注目的使用情况。
恕我直言,scanf()
根本就不是这个工作的工具。每次我开始着手利用其更强大的功能有一段时间,我已经结束了最终翻录,落实以不同的方式的能力。在某些情况下使用法写一个真实词法分析器,但通常做线在时间I / O和粗分解成与strtok()
令牌做值变换前是足够了的意思。
编辑:我结束通常剥开scanf()
因为当面对用户坚持提供不正确的输入,它只是不擅长于帮助程序提供了有关该问题的良好反馈,并且具有汇编打印“错误,终止。”作为其唯一有用的错误消息是不会在好与我的用户。 (我,在这种情况下。)
这就像字符集从正则表达式; [0-9]
数字字符串匹配时,匹配[^aeiou]
任何不是小写元音等
有各种用途,例如拉出的数字,识别符,空白的大块等
您可以在 ISO读到它/ IEC9899标准可以在线获得。
下面是一个段落我从文档引用约[
(页286):
匹配从一组字符的非空序列的预期 字符。
在转换指定包括在所有后续字符 格式字符串,直至并包括匹配的右括号(])。该 支架(扫描列表)之间的字符组成扫描集, 除非左括号后的字符是一个音调符号(^),在 这种情况下,扫描集包含不会出现在所有的字符 抑扬和右支架之间的扫描列表。如果 转换说明开始于[]或[^],右支架 字符在扫描列表和下一个随后的右支架 字符表示结束说明书中的匹配的右支架; 否则第一以下右括号字符是一个 结束本说明书。如果 - 个字符是扫描列表,而不是 第一,或第二,其中第一个字符是^,也不是 最后一个字符,该行为是实现定义的。