问题描述
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
的模式时,可以将printf
与regex
结合使用)
***正确答案开始***
scanf
使用与printf
不同的格式字符串规则scanf
的手册页中是printf
的规则的补充
[
匹配指定集合中的非空字符序列 可接受的字符;下一个指针必须是指向char的指针, 并且字符串中的所有字符必须有足够的空间, 加上一个终止的空字节。通常领先空白的跳过是 压抑。该字符串由(或不在)a中的字符组成 特定集合该集合由打开之间的字符定义 方括号[字符和右方括号]字符。该集合不包括 如果在方括号后的第一个字符是 抑扬符(^)。要在集合中包含右括号,请使其 开括号或扬音符号后的第一个字符;任何其他 位置将结束设定。连字符-也很特殊; 当放在其他两个字符之间时,它会添加所有中间字符 字符集。要包含连字符,请使其最后一个字符 在最后的括号之前。例如,[^] 0-9-]表示集合 “除右括号,零到九和连字符以外的所有内容”。的 字符串以字符不在(或以 抑或在字段宽度用完时。
这基本上意味着scanf
可以使用regex
的规则的子集(字符集子集)进行扫描,但不能使用regex
的所有规则进行扫描
说明符%[
与%s
是不同的转换说明符,即使它也必须与类型为char *
(或wchar_t *
)的参数配对。参见例如表here
[set]匹配字符集中的非空字符序列。
如果集合中的第一个字符是^,则所有不在集合中的字符都将匹配。如果集合以]或^]开头,则[]字符也将包含在集合中。如[0-9]中所示,由实现方式定义,扫描集中非初始位置的字符-是否可以指示范围。如果使用宽度说明符,则仅匹配最大宽度。除了匹配的字符外,还总是存储一个空字符(因此参数数组必须至少可以容纳width + 1个字符)