【问题标题】:C: extract numbers from a stringC:从字符串中提取数字
【发布时间】:2012-07-29 09:36:05
【问题描述】:

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

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

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

我的计划是找到每个数字的第一个数字的位置,然后用 sscanf 读取数字,但尽管我考虑了这么多,但我找不到合适的方法。看了很多关于strstr的文章,但是它是用来将一个字符串搜索成另一个字符串的,所以我应该搜索确切的数字或者做10个案例来覆盖从0到9。

提前感谢您的支持!

【问题讨论】:

    标签: c string strstr


    【解决方案1】:

    你可以试试这样的:

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

    或者,您可以tokenize 字符串(使用"(,+)")并尝试strtoul 一切。

    【讨论】:

    • 我最终选择将 strtok() 与 atoi() 结合使用,但我不得不使用这个字符串 "Trim(,+) \n" 而不是您建议的那个。谢谢大家的帮助!
    【解决方案2】:
    #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;
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        这是我对代码的看法:

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

        请注意,我们使用两个不同的计数器进行计数,一个用于源数组,它会随着每次循环迭代而递增,另一个用于目标数组,并且仅在找到数字时才会递增

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

        检查字符是否为数字的另一种方法是参考 ASCII 表检查其值 字符'0'等于48,字符'9'等于57。因此,如果字符在该范围内,则为数字,否则为字符。其实你可以直接和人物比较。

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

        【讨论】:

          【解决方案5】:
          #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;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-09-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-17
            • 2016-06-24
            • 1970-01-01
            相关资源
            最近更新 更多