C从字符串中提取数字

时间:2018-04-25 13:03:14

标签: c

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

数字介于“=”和“;”

之间
 #include <stdio.h>

    int main() {
      char name[20];
      int id;
      sscanf("tabid=12544787844;123", "%[^=]=%d", name, &id);
      printf(" name = %s id=%d\n", name ,id);
      return 1;
    }

我得到了以下结果:

  

name = tabid id = -340114044

sscanf的正则表达式有什么问题

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

发布的代码包含一些问题,如问题评论中所述。

以下提议的代码:

  1. 正确格式化`sscanf()
  2. 调用的&#39;格式字符串
  3. 正确地声明ID变量足够大以容纳ID
  4. 正确检查错误
  5. 缩进代码以提高可读性
  6. 为您提供帮助,记录每个头文件包含的原因
  7. 消除了魔法&#39;通过给它一个有意义的名字来编号
  8. 注意;123永远不会输入
  9. 现在,建议的代码

    #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;
    }