c - C %*s 中的字符串格式
问题描述
我在某处看到了 C 中的一段代码
char name[51];
int group = 0;
scanf("%*s %50s %*s %d", name, &group);
printf("%s / %d\n", name, group);
如果我们介绍
“名称:史密斯组:7”
它等待我们引入另一个值。真奇怪。到底发生了什么,%*s %50s %*s
意味着什么。我%*s
之前看过,但从未在阅读字符串之前和之后放置过。
解决方案
转换说明符*
之后%
和之前是分配抑制标志。它表示匹配的条目将不会被存储(即,将被丢弃)并且不需要相应的存储参数。
引用C11
,第 7.21.6.2 章
[...] 除非由 a 指示分配抑制,否则
*
转换结果将放置在尚未收到转换结果的格式参数之后的第一个参数所指向的对象中。
也就是说,对于输入
Name:Smith Group:7
你期望的是类似的东西
%*s
匹配“名称:”并丢弃%50s
匹配“Smith”和商店%*s
匹配“组:”并丢弃%d
比赛7
和商店。
但是,有一个问题。对于转换说明符s
,
匹配一系列非空白字符
这意味着,它将扫描并匹配直到出现空格,并且由于在“Group”之前没有空格,因此整个“Name:Smith”将被第一个%*s
指令使用。以下情况%*s
也一样。因此,转换规范没有结束,而是scanf()
等待下一个输入被消费。
因此,要匹配转换规范,请将输入提供为
Name: Smith Group: 7
^^ ^^
推荐阅读
- c# - 启动基地失败!/app/.local-chromium/Linux-706915/chrome-linux/chrome: ... libX11.so.6
- python - 如何查找列表中前两个元素的索引,它们是另一个列表中的任何元素?
- reactjs - Reactjs 输出未显示
- gdb - 是否可以指示 GDB 从目标异步获取变量值?
- sql-server - 将日期时间转换为生肖名称
- r - 从 R 列中删除特殊字符和数字
- laravel - laravel check var 如何收集(特定)模型?
- python - ValueError:尝试获取空序列的 argmin 但矩阵不为空
- ios - CLGeocoder 对于纬度/经度总是返回 nil
- python - 如何处理python图中的未知标签和边