C-scanf的格式说明符?

问题描述

float lat,lon;
char info[50];

scanf("%f,%f,%49[^\n]",&lat,&lon,info);

在以上代码段中,%49[^\n]是哪种格式说明符。

我确实知道这是字符数组的格式说明符,它将接受最多49个字符的输入(+小数点\ 0),而[^\n]看起来像是一个正则表达式(尽管我在某个地方读过)该scanf不支持正则表达式)或一个字符集,该字符集将扩展为非“换行符” \n的“任何其他字符”。我说得对吗?

此外,为什么格式说明符中没有s才能写入数组信息?

此代码段的程序来自作品。但这是很好的C风格吗?

解决方法

很抱歉,我在下面错误地回答了。如果您可以跳到最后,我会给您正确的答案。

***错误答案开始***

这不是适当的格式说明符,因为没有类型。

%[parameter][flags][width][.precision][length]type

是format语句的规则。如您所见,type是非可选的。该格式项目的作者认为,当两者具有完全不同的处理规则(并且regex不遵循printf的模式时,可以将printfregex结合使用)

***正确答案开始***

scanf使用与printf不同的格式字符串规则scanf的手册页中是printf的规则的补充

[

匹配指定集合中的非空字符序列 可接受的字符;下一个指针必须是指向char的指针, 并且字符串中的所有字符必须有足够的空间, 加上一个终止的空字节。通常领先空白的跳过是 压抑。该字符串由(或不在)a中的字符组成 特定集合该集合由打开之间的字符定义 方括号[字符和右方括号]字符。该集合不包括 如果在方括号后的第一个字符是 抑扬符(^)。要在集合中包含右括号,请使其 开括号或扬音符号后的第一个字符;任何其他 位置将结束设定。连字符-也很特殊; 当放在其他两个字符之间时,它会添加所有中间字符 字符集。要包含连字符,请使其最后一个字符 在最后的括号之前。例如,[^] 0-9-]表示集合 “除右括号,零到九和连字符以外的所有内容”。的 字符串以字符不在(或以 抑或在字段宽度用完时。

这基本上意味着scanf可以使用regex的规则的子集(字符集子集)进行扫描,但不能使用regex的所有规则进行扫描

,

说明符%[%s是不同的转换说明符,即使它也必须与类型为char *(或wchar_t *)的参数配对。参见例如表here

[set]匹配字符集中的非空字符序列。
如果集合中的第一个字符是^,则所有不在集合中的字符都将匹配。如果集合以]或^]开头,则[]字符也将包含在集合中。如[0-9]中所示,由实现方式定义,扫描集中非初始位置的字符-是否可以指示范围。如果使用宽度说明符,则仅匹配最大宽度。除了匹配的字符外,还总是存储一个空字符(因此参数数组必须至少可以容纳width + 1个字符)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...