2

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

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

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

我的计划是找到每个数字的第一个数字的位置,然后用 sscanf 读取数字,但尽管我已经考虑过了,但我找不到合适的方法。我已经阅读了很多关于 strstr 的内容,但它用于将一个字符串搜索到另一个字符串,所以我应该搜索确切的数字或做 10 个案例以涵盖从 0 到 9。

提前感谢您的支持!

4

5 回答 5

3

你可以尝试这样的事情:

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

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

于 2012-07-29T09:39:13.297 回答
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;
}
于 2012-07-29T10:01:22.410 回答
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;
}
于 2012-07-29T17:02:41.913 回答
0

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

于 2012-07-29T10:36:38.627 回答
0

以下是我对代码的看法:

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

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

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

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

if (character >= '0' && character =< '9') printf("%c is a digit", character);
于 2012-07-29T14:06:42.133 回答