sscanf()如何在C中拆分字符串

sscanf()如何在C中拆分字符串,c,string,input,formatting,scanf,C,String,Input,Formatting,Scanf,因此,基本上我有一个简单的字符串,我尝试使用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);

因此,基本上我有一个简单的字符串,我尝试使用
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;
}
#包括
int main()
{
int i=10,j;
char ch='A',ch2;
浮点数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);
返回0;
}
现在我的疑问是
sscanf
如何准确地知道在哪里拆分字符串。这里的值
10
进入变量
j
。字符
A
进入变量
ch2
3.140000
进入变量
b
。sscanf是如何解析此字符串并将值存储在不同变量中的。如果您能解释
sscanf
如何准确地与任何字符串一起工作,这是值得注意的。我很难理解它。

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

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

sscanf(str,"%d%c%f",&j,&ch2,&b);
  • %d
    解析搜索十进制整数的字符串。这意味着只接受范围
    0-9
    中的数字字符。此外,接受前导符号字符(如数字
    -123
    )。将使用符合此条件的所有字符
  • %c
    扫描任何字符,将其ASCII值保存在目标变量中。使用单个字符
  • %f
    解析字符串以搜索浮点数。与
    %d
    情况类似,所有十进制数字和符号字符都可以接受,但它也可以接受
    字符,将其解释为浮点
那么,让我们再看看您的输入字符串:

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

    如果字符串在这里结束,
    scanf
    将返回1

  • scanf
    继续解析字母
    'A'
    。由于我们有
    %c
    格式说明符,因此使用该字符,并将值65(ASCII表示
    'A'
    )存储在
    ch2

    如果字符串在这里结束,
    scanf
    将返回2

  • 字母
    'A'
    用完后
    scanf
    继续从字符
    '3'
    解析。
    %f
    格式说明符将接受所有剩余字符(因为它们都有效),值
    3.14
    存储在变量
    b

    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

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

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

    sscanf(str,"%d%c%f",&j,&ch2,&b);
    
    • %d
      解析搜索十进制整数的字符串。这意味着只接受范围
      0-9
      中的数字字符。此外,接受前导符号字符(如数字
      -123
      )。将使用符合此条件的所有字符
    • %c
      扫描任何字符,将其ASCII值保存在目标变量中。使用单个字符
    • %f
      解析字符串以搜索浮点数。与
      %d
      情况类似,所有十进制数字和符号字符都可以接受,但它也可以接受
      字符,将其解释为浮点
    那么,让我们再看看您的输入字符串:

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

    如果字符串在这里结束,
    scanf
    将返回1

  • scanf
    继续解析字母
    'A'
    。由于我们有
    %c
    格式说明符,因此使用该字符,并将值65(ASCII表示
    'A'
    )存储在
    ch2

    如果字符串在这里结束,
    scanf
    将返回2

  • 字母
    'A'
    用完后
    scanf
    继续从字符
    '3'
    解析。
    %f
    格式说明符将接受所有剩余字符(因为它们都有效),值
    3.14
    存储在变量
    b

    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";
    
    在第一个整数后面有两个非数字字符。