2012-07-29 86 views
2

我有一大堆的结构像这样的C:从一个字符串中提取号码

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

什么,我想要做的是把所有的号码保存到一个数组(这个答案让我们着想串说我想保存一个字符串的数字)。

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

在此先感谢您的支持!

回答

3

你可以尝试这样的事:

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

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

+0

我最终还是选择结合使用的strtok()用的atoi(),但我不得不使用这个字符串 “修剪(+)\ n”,而不是一个你的建议。感谢大家的帮助! – Ithilion 2012-08-02 16:33:04

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

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

0

这里是我会考虑的代码:

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

注意,我们有两个不同的计数器一个用于源阵列,其将与每一个循环迭代递增,并且另一个用于目标阵列,并且如果一个数字是将只递增计数发现一个字符的

检查是一个数字或者没有可以用函数来完成“ISDIGIT()”,但它需要头文件ctype.h

另一种方法来检查,如果字符是一个数字被通过参考ASCII表 来检查其值,字符'0'等于48并且字符r'9'等于57.所以如果角色在这个范围内,它就是一个数字,否则它就是一个角色。你可以直接与角色进行比较。

if (character >= '0' && character =< '9') printf("%c is a digit", character); 
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; 
}