首页 > 解决方案 > 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进入变量ch23.140000进入变量b。sscanf 究竟如何解析这个字符串并将值存储在不同的变量中。如果您能解释如何sscanf与任何字符串一起工作,那将是很有意义的。我很难理解它。

标签: cstringinputformattingscanf

解决方案


scanf 根据您在格式字符串中定义的格式说明符使用输入字符串。

让我们分析您的格式字符串:

sscanf(str,"%d%c%f",&j,&ch2,&b);
  • %d解析搜索十进制整数的字符串。这意味着只0-9接受范围内的数字字符。此外,接受前导符号字符(如 number -123)。满足此条件的所有角色都被消耗
  • %c扫描任何字符,将其 ASCII 值保存在目标变量中。消耗单个字符
  • %f解析搜索floats的字符串。像这种%d情况一样,所有十进制数字和符号字符都被接受,但它也接受将.其解释为浮点的字符

所以,让我们再看看你输入的字符串:

char str[20]="10A3.140000";
  1. scanf从第一个字符开始解析。由于存在十进制数字,因此它会消耗它们,直到找到第一个非数字字符('A')。整数10存储在j.

    如果字符串在这里完成,scanf将返回 1。

  2. scanf继续从信中解析'A'。由于我们有%c格式说明符,这个字符被消耗,值 65(ASCII 表示'A')存储在ch2.

    如果字符串在这里完成,scanf将返回 2。

  3. 字母'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


推荐阅读