2016-08-17 76 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);