C:从字符串中提取数字

时间:2012-07-29 09:36:05

标签: c string strstr

我有一堆像这样的结构的字符串

Trim(2714,8256)++Trim(10056,26448)++Trim(28248,49165)

我想要做的是将所有数字保存到数组中(为了这个答案,我想说我想保存一个字符串的数字)。

我的计划是找到每个数字的第一个数字的位置,然后用sscanf读取数字,但是就我所想的那样,我找不到合适的方法。我已经阅读了很多关于strstr的内容,但它用于在另一个字符串中搜索字符串,因此我应该搜索确切的数字或者从10到9覆盖10个案例。

提前感谢您的支持!

5 个答案:

答案 0 :(得分:3)

您可以尝试这样的事情:

  • 走完字符串,直到找到第一个数字(使用isdigit
  • 使用strtoul提取从该位置开始的数字
    • strtoul返回号码
    • 第二个参数(endptr)指向字符串中的下一个字符,跟随提取的数字
  • 冲洗,重复

或者您可以tokenize字符串(使用"(,+)")并尝试strtoul所有内容。

答案 1 :(得分:3)

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main() {
  int arr[10], idx=0, d, l=0;
  char *p, *str = "Trim(2714,8256)++Trim(10056,26448)++Trim(28248,49165)";
  for (p = str; *p != 0; p+=l) {
    l = 1;
    if (isdigit(*p)){
      sscanf(p, "%d%n", &d, &l);
      arr[idx++] = d;
    }   
  }   
  for (l=0; l<idx; l++) {
    printf("%d\n", arr[l]);
  }
  return 0;
}

答案 2 :(得分:0)

您也可以尝试使用YACC或Lex,它会根据需要格式化您的字符串。

答案 3 :(得分:0)

以下是我对代码的看法:

  
      
  • 启动源数组字符循环   
        
    • 如果当前位置(源数组)中的字符是数字
    •   
    • 将其复制到目标数组(在目标数组的当前位置)
    •   
    • 移动到目标数组中的下一个位置
    •   
    • 移动到源数组中的下一个位置
    •   
    • 如果到达源字符串的末尾,则退出循环
    •   
  •   
  • 确保目标字符串正确终止(即通过'\ 0')
  •   

请注意,我们计算两个不同的计数器,一个用于源数组,每个循环迭代都会递增,另一个用于目标数组,只有在找到一个数字时才会递增

检查字符是否为数字可以使用函数“isdigit()”来完成,但它需要头文件ctype.h

检查字符是否为数字的另一种方法是检查其参考ASCII表的值 字符'0'等于48,字符'9'等于57.因此,如果字符在该范围内,则它是一个数字,否则它是一个字符。您实际上可以直接与字符进行比较。

if (character >= '0' && character =< '9') printf("%c is a digit", character);

答案 4 :(得分:0)

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main() {
  int array[8], count=0, data;
  const char *s = "Trim(+2714,8256)++Trim(10056,26448)++Trim(28248,49165)";
  char *p;
  while(*s) {
    if(isdigit(*s) || *s=='-' && isdigit(s[1])){
      data = strtol(s, &p, 10);
      s = p;
      array[count++] = data;
    } else
        ++s;
  }
  {//test print
    int i;
    for(i=0;i<count;++i)
      printf("%d\n", array[i]);
  }
  return 0;
}