2016-08-17 34 views
1

首先,我知道过类似的问题,但我相信我的情况有所不同。如何从字符串中提取多位数字?

我的输入字符串是:

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

我写了下面提取到数组中的代码。

main(){ 
char s[100]; 
int i=0,x,n=0; 
int a[20]; 
printf("Enter the sets:"); 
gets(s); 
x=strlen(s); 
while(i<x){ 
    if((s[i]=='(' && s[i+2]==',') || (s[i]==',' && s[i+2]==')')) 
    { 
     a[n]=s[i+1]-'0'; 
     n++; 
    } 
    i++; 
} 
for(i=0;i<n;i++){ 
    printf("%d\n",a[i]); 
} 
} 

我得到的输出是:

我明白为什么我的代码将跳过具有2个或更多的数字号码。 请对本代码提出一些小修改来解决此限制。

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

回答

0

如果输入的格式与问题中的格式完全一样,那么您可以在main 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++; 
} 
+0

我强烈建议不要接受这个答案,因为它不正确。只有2位数字才是正确的,但当涉及3位或更多数字时,它不能正常工作。下面有很多好的答案。 – Mirakurun

+0

@Mirakurun - 如果输入的格式与问题中的格式完全相同,则代码适用于两位数以上的数字。你能否提供破坏代码的测试用例? – rht

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

输出:

[email protected]:~/projects/test$ ./test 
5 7 1 6 2 4 10 14 8 9 
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没有像正则表达式分(它已经分裂功能,但我不明白的还有简单的字符串函数)。或者,这里是它的ideone https://ideone.com/eRKTbD

+0

为什么这么复杂? – Mirakurun

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, ')'); 
} 
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);