如何从c中的字符串中提取数字?

假设我有一个像ab234cid*(s349*(20kd的字符串ab234cid*(s349*(20kd ,我想提取所有数字ab234cid*(s349*(20kd ,我该怎么办?

您可以使用strtol执行此操作,如下所示:

 char *str = "ab234cid*(s349*(20kd", *p = str; while (*p) { // While there are more characters to process... if ( isdigit(*p) || ( (*p=='-'||*p=='+') && isdigit(*(p+1)) ) { // Found a number long val = strtol(p, &p, 10); // Read number printf("%ld\n", val); // and print it. } else { // Otherwise, move on to the next character. p++; } } 

链接到ideone 。

使用sscanf()和扫描集的可能解决方案:

 const char* s = "ab234cid*(s349*(20kd"; int i1, i2, i3; if (3 == sscanf(s, "%*[^0123456789]%d%*[^0123456789]%d%*[^0123456789]%d", &i1, &i2, &i3)) { printf("%d %d %d\n", i1, i2, i3); } 

其中%*[^0123456789]表示忽略输入,直到找到一个数字。 请参阅http://ideone.com/2hB4UW上的演示。

或者,如果数字的数量未知,您可以使用%n说明符来记录缓冲区中读取的最后位置:

 const char* s = "ab234cid*(s349*(20kd"; int total_n = 0; int n; int i; while (1 == sscanf(s + total_n, "%*[^0123456789]%d%n", &i, &n)) { total_n += n; printf("%d\n", i); } 

在使用sscanf的简单解决方案之后:

 #include #include #include char str[256]="ab234cid*(s349*(20kd"; char tmp[256]; int main() { int x; tmp[0]='\0'; while (sscanf(str,"%[^0123456789]%s",tmp,str)>1||sscanf(str,"%d%s",&x,str)) { if (tmp[0]=='\0') { printf("%d\r\n",x); } tmp[0]='\0'; } } 

如果数字是由字符串中的空格分隔的,那么您可以使用sscanf()。 既然,你的例子并非如此,你必须自己做:

 char tmp[256]; for(i=0;str[i];i++) { j=0; while(str[i]>='0' && str[i]<='9') { tmp[j]=str[i]; i++; j++; } tmp[j]=0; printf("%ld", strtol(tmp, &tmp, 10)); // Or store in an integer array 

}

创建一个基于一个基本原则的状态机:当前字符是一个数字。

  • 从非数字转换为数字时,初始化current_number:= number。
  • 当从数字转换为数字时,您将“移位”新数字:
    current_number:= current_number * 10 +数字;
  • 当从数字转换为非数字时,输出current_number
  • 当从非数字到非数字时,你什么都不做。

优化是可能的。

或者你可以做一个像这样的简单函数:

 // Provided 'c' is only a numeric character int parseInt (char c) { return c - '0'; }