C从字符串中提取数字

C从字符串中提取数字,c,C,我想使用sscanf从字符串中提取一个数字 数字介于“=”和“;” #包括 int main(){ 字符名[20]; int-id; sscanf(“tabid=12544787844;123”、“%[^=]=%d”、名称和id); printf(“name=%s id=%d\n”,name,id); 返回1; } 我得到了以下结果: name=tabid id=-34011444 sscanf的正则表达式有什么问题呢?12544787844不适合int,因为它大于int\u MAX(因此会出

我想使用sscanf从字符串中提取一个数字

数字介于“=”和“;”

#包括
int main(){
字符名[20];
int-id;
sscanf(“tabid=12544787844;123”、“%[^=]=%d”、名称和id);
printf(“name=%s id=%d\n”,name,id);
返回1;
}
我得到了以下结果:

name=tabid id=-34011444


sscanf的正则表达式有什么问题呢?
12544787844
不适合
int
,因为它大于
int\u MAX
(因此会出现溢出)。将
long-long
%lld
格式字符串一起使用。

12544787844
不适合
int
,因为它大于
int\u MAX
(因此会出现溢出)。将
long
%lld
格式字符串一起使用。

发布的代码包含一些问题,如问题注释中所述

建议的守则如下:

  • 正确设置调用'sscanf()的'format字符串的格式
  • 正确地声明ID变量足够大以容纳ID
  • 正确检查错误
  • 缩进代码以提高可读性
  • 为了帮助您,请记录包含每个头文件的原因
  • 通过给“神奇”数字起一个有意义的名字来消除它
  • 注意
    ;123从不输入
  • 现在,拟议的守则

    #include <stdio.h>  // sscanf(), sprintf()
    #include <stdlib.h> // exit(), EXIT_FAILURE
    
    #define MAX_NAME_LEN 20
    
    int main( void )
    {
        char name[ MAX_NAME_LEN +1 ];
        long long int id;
    
        char format[20];
        sprintf( format, "%%%d[^=]=%%lld", MAX_NAME_LEN );
    
        int status = sscanf("tabid=12544787844;123", format, name, &id);
        if( status != 2 )
        {
            fprintf( stderr, "sscanf failed to extract the two fields\n" );
            exit( EXIT_FAILURE );
        }
    
        // implied else, sscanf successful
    
        printf(" name = %s id=%lld\n", name ,id);
        // by convention:
        // returning 0 indicates success,
        // returning 1 indicates a failure
        return 0;
    }
    
    #包括//sscanf(),sprintf()
    #包括//退出(),退出失败
    #定义最大名称长度20
    内部主(空)
    {
    字符名[MAX_name_LEN+1];
    长整型id;
    字符格式[20];
    sprintf(格式,“%%%d[^=]”=%%%lld”,最大名称长度);
    int status=sscanf(“tabid=12544787844;123”,格式、名称和id);
    如果(状态!=2)
    {
    fprintf(stderr,“sscanf未能提取这两个字段\n”);
    退出(退出失败);
    }
    //否则,sscanf将成功
    printf(“name=%s id=%lld\n”,name,id);
    //按惯例:
    //返回0表示成功,
    //返回1表示失败
    返回0;
    }
    
    发布的代码包含一些问题,如问题注释所述

    建议的守则如下:

  • 正确设置调用'sscanf()的'format字符串的格式
  • 正确地声明ID变量足够大以容纳ID
  • 正确检查错误
  • 缩进代码以提高可读性
  • 为了帮助您,请记录包含每个头文件的原因
  • 通过给“神奇”数字起一个有意义的名字来消除它
  • 注意
    ;123从不输入
  • 现在,拟议的守则

    #include <stdio.h>  // sscanf(), sprintf()
    #include <stdlib.h> // exit(), EXIT_FAILURE
    
    #define MAX_NAME_LEN 20
    
    int main( void )
    {
        char name[ MAX_NAME_LEN +1 ];
        long long int id;
    
        char format[20];
        sprintf( format, "%%%d[^=]=%%lld", MAX_NAME_LEN );
    
        int status = sscanf("tabid=12544787844;123", format, name, &id);
        if( status != 2 )
        {
            fprintf( stderr, "sscanf failed to extract the two fields\n" );
            exit( EXIT_FAILURE );
        }
    
        // implied else, sscanf successful
    
        printf(" name = %s id=%lld\n", name ,id);
        // by convention:
        // returning 0 indicates success,
        // returning 1 indicates a failure
        return 0;
    }
    
    #包括//sscanf(),sprintf()
    #包括//退出(),退出失败
    #定义最大名称长度20
    内部主(空)
    {
    字符名[MAX_name_LEN+1];
    长整型id;
    字符格式[20];
    sprintf(格式,“%%%d[^=]”=%%%lld”,最大名称长度);
    int status=sscanf(“tabid=12544787844;123”,格式、名称和id);
    如果(状态!=2)
    {
    fprintf(stderr,“sscanf未能提取这两个字段\n”);
    退出(退出失败);
    }
    //否则,sscanf将成功
    printf(“name=%s id=%lld\n”,name,id);
    //按惯例:
    //返回0表示成功,
    //返回1表示失败
    返回0;
    }
    
    12亿美元。不适合4字节仅用于记录:
    scanf()
    格式字符串不是正则表达式。我假设在您的最终代码中,输入不会被硬编码,因此
    %[^=]
    是一个等待利用的缓冲区溢出-使用
    %19[^=]
    。我会一起删除
    sscanf
    ,自己解析字符串并使用将字符串转换为数字。12 bln。不适合4字节仅用于记录:
    scanf()
    格式字符串不是正则表达式。我假设在您的最终代码中,输入不会被硬编码,因此
    %[^=]
    是一个等待利用的缓冲区溢出-使用
    %19[^=]
    。我会一起删除
    sscanf
    ,我自己解析字符串并使用将字符串转换为数字。顺便说一句,这是不使用
    scanf()
    的众多原因之一:无法可靠地检测到这一点。但这超出了这里的范围,所以,回答得好。@Dan我将变量类型更改为long-long,但我无法获得正确的数字值@Anis_堆栈,因为您还需要将格式字符串更改为
    “%[^=]=%lld”
    ,并在
    printf
    中(
    “name=%s id=%lld\n”
    )。这是一开始不使用
    scanf()
    的众多原因之一:无法可靠地检测到这一点。但这超出了这里的范围,所以,回答得好。@Dan我将变量类型更改为long-long,但我无法获得正确的数字值@Anis_堆栈,因为您还需要将格式字符串更改为
    “%[^=]=%lld”
    并且也更改为
    printf
    “name=%s id=%lld\n”
    )。