如何从字符串中提取多位数?

时间:2016-08-17 11:44:18

标签: c string string-parsing

首先,我知道之前曾提出过类似的问题,但我相信我的情况有所不同。

我的输入字符串是:

  

(5,7)(1,6)(2,4)(10,14)(8,9)

我编写了以下代码用于提取到数组中。

<script type="text/javascript">
        $(document).ready(function () {

        $("form").validate({
                                rules:{
                                        textarea_name:{
                                                required:true,
                                                maxlength:50
                                                }
                                      }
                               });
                           });
</script>

我得到的输出是:

  

5 7 1 6 2 4 8 9

我理解为什么我的代码会跳过包含2位或更多位数的数字。 请建议对此代码进行一些小的更改以修复此限制。

P.S.-我正在寻找一种不依赖于数字长度的解决方案。

5 个答案:

答案 0 :(得分:4)

由于您只关心数字而不关心任何分隔符,因此可以使用strtok,它允许一组分隔符。

使用以下内容代替您现有的while循环:

char *p = strtok(s, "(), ");
while (p) {
    a[n++] = atoi(p);
    p = strtok(NULL, "(), ");
}

输出:

5
7
1
6
2
4
10
14
8
9

另一方面,如果您对格式有所了解,可以执行以下操作:

char *start = s, *p1 = NULL, *p2 = NULL, *p3 = NULL;
if (start) p1 = strchr(start, '(');
if (p1) p2 = strchr(p1+1, ',');
if (p2) p3 = strchr(p2+1, ')');
while (p1 && p2 && p3) {
    a[n++] = atoi(p1+1);
    a[n++] = atoi(p2+1);
    start = p3+1;
    if (start) p1 = strchr(start, '(');
    if (p1) p2 = strchr(p1+1, ',');
    if (p2) p3 = strchr(p2+1, ')');
}

答案 1 :(得分:0)

我使用了不同的方法来解决问题,但我已经解决了它并且它有效。考虑尝试这个。顺便说一句,我使用char * s作为字符串文字,但你可以保持它像你的。

main(){

  char *s="(5,7) (1,6) (2,4) (10,14) (8,9)";
  int i=0,x,n=0;
  char a[20];
  x=strlen(s);
  while(i<x){

    if (isdigit(s[i])) {
      a[n]=s[i];
      if (s[i+1]==',' || s[i+1]==')') {
        a[n+1]=' ';
        n++;
      }
      n++;
    }
      i++;
  }
  printf("%s\n", a);
}

输出:

tenshi@mashiro:~/projects/test$ ./test 
5 7 1 6 2 4 10 14 8 9 

答案 2 :(得分:0)

#include <stdio.h>

int main(void) {
    // your code goes here
char s[100];
int i=0,x,n=0;
int a[20];
printf("Enter the sets:");
gets(s);
x=strlen(s);
while(i<x-1){
    if(isdigit(s[i]))
    {
        if(isdigit(s[i+1]))
        {
            a[n]=(s[i]-'0')*10  +(s[i+1]-'0');
            i++;
        }
        else
        {
            a[n]=s[i]-'0';
        }
        n++;
    }   
    i++;
}
printf("\n");
for(i=0;i<n;i++){
    printf("%d\n",a[i]);
}
    return 0;
}

上面的代码怎么样,遗憾的是C没有简单的字符串函数,比如用Regex拆分(它有拆分功能,但我不太了解)。或者,这里是它的意思https://ideone.com/eRKTbD

答案 3 :(得分:0)

如果输入的格式与问题中的格式完全相同,那么您可以在主while循环中添加两个循环以一次读取一组。

while (i < x)
{
    if (s[i] == '(')
    {
        // temporary var to store number
        int num = 0;

        // read first number
        while (s[++i] != ',')
            num = num*10 + s[i]-'0';
        a[n++] = num;

        num = 0;
        // read second number
        while (s[++i] != ')')
            num = num*10 + s[i]-'0';
        a[n++] = num;
    }
    i++;
}

答案 4 :(得分:0)

如果您始终使用相同的格式(a,b)(c,d)...(y,z)和相同数量的值,则此解决方案可以正常工作:

char * arr = "(5,7)(1,6)(2,4)(10,14)(8,9)";
int a,b,c,d,e,f,g,h,i,j;

sscanf(arr,"(%d,%d)(%d,%d)(%d,%d)(%d,%d)(%d,%d)",&a,&b,&c,&d,&e,&f,&g,&h,&i,&j);

printf("%d %d %d %d %d %d %d %d %d %d\n", a, b, c, d, e, f, g, h, i, j);