c - sscanf() 如何在 C 中拆分字符串
问题描述
所以基本上我有一个简单的字符串,我试图用它sscanf()
来分割这个字符串并将值存储在适当的变量中:
#include<stdio.h>
int main()
{
int i=10,j;
char ch = 'A',ch2;
float a=3.14,b;
char str[20]="10A3.140000";
sscanf(str,"%d%c%f",&j,&ch2,&b);
printf("%d %c %f\n",j,ch2,b);
return 0;
}
现在我的疑问是如何确切地sscanf
知道在哪里分割字符串。这里的值10
进入 variable j
。字符A
进入变量ch2
并3.140000
进入变量b
。sscanf 究竟如何解析这个字符串并将值存储在不同的变量中。如果您能解释如何sscanf
与任何字符串一起工作,那将是很有意义的。我很难理解它。
解决方案
scanf
根据您在格式字符串中定义的格式说明符使用输入字符串。
让我们分析您的格式字符串:
sscanf(str,"%d%c%f",&j,&ch2,&b);
%d
解析搜索十进制整数的字符串。这意味着只0-9
接受范围内的数字字符。此外,接受前导符号字符(如 number-123
)。满足此条件的所有角色都被消耗%c
扫描任何字符,将其 ASCII 值保存在目标变量中。消耗单个字符%f
解析搜索floats的字符串。像这种%d
情况一样,所有十进制数字和符号字符都被接受,但它也接受将.
其解释为浮点的字符
所以,让我们再看看你输入的字符串:
char str[20]="10A3.140000";
scanf
从第一个字符开始解析。由于存在十进制数字,因此它会消耗它们,直到找到第一个非数字字符('A'
)。整数10
存储在j
.如果字符串在这里完成,
scanf
将返回 1。scanf
继续从信中解析'A'
。由于我们有%c
格式说明符,这个字符被消耗,值 65(ASCII 表示'A'
)存储在ch2
.如果字符串在这里完成,
scanf
将返回 2。字母
'A'
被消耗后scanf
继续从 character 解析'3'
。格式说明符将%f
接受所有剩余的字符(因为它们都是有效的),并且值3.14
存储在 variableb
中。scanf
现在返回 3。
我试图理解由返回的值,scanf
因为它正在检查您是否可以控制正在发生的事情。在你的情况下
if( sscanf(str,"%d%c%f",&j,&ch2,&b) == 3 )
{
printf("%d %c %f\n",j,ch2,b);
}
将防止那些格式错误的字符串会导致未定义行为的情况。要理解这种情况,请考虑以下字符串:
char str[20]="10AB3.140000";
我们在第一个整数之后有两个非数字字符。然后:
%d
仍然会消耗价值10
%c
仍然会消耗这封信'A'
- 但
%f
不会使用以下字符串,因为"B3.140000"
无法将子字符串解析为浮点数:这会导致'B'
中断scanf
解析并返回值 2。
因此,如果不检查返回值,将访问未初始化的变量。b
推荐阅读
- python - Python Pandas to_csv,能不能用.replace() 抢先处理双引号转义问题
- java - 为什么我无法使用 StringTokenizer 访问第二个令牌?
- r - 如何覆盖@运算符以访问 R 中 S4 对象的插槽
- database - mongorestore时MongoDB如何处理Object ID重叠?
- matlab - 梯度下降 - 逻辑回归 - 奇怪的 thetas
- excel - 粘贴新数据时 Excel 表格公式范围错误地递增
- android-studio - 尝试运行 Android 应用程序时出现 INSTALL_FAILED_MISSING_SHARED_LIBRARY 错误
- postgresql - 在 Windows 上为 PostgreSQL 注册事件日志时出错
- bash - 如何将动态数量的参数传递给 sed 以用作过滤器
- jquery - 需要将 onblur 更改为 onclick 的说明