2016-11-13 5 views
0

Я хочу получить все числа из определенной строки, но эти цифры могут иметь длину более одной цифры as (15, 587, ... exc). Вот то, что я сделал «свой собственный код»:Извлечь все числа из N цифр из строки в C

int firstIndxOfNumb(char* str, int startIndx, int len) { 
    int i, val; 
    i = startIndx; 
    while (str[i] && i < len) { 
     val = str[i]; 
     if (isdigit(val)) 
      return i; 
     i++; 
    } 
    return -1; 
} 

int lastIndxOfNumb(char* exp, int len, int indx1){ 
    int i, curr; 
    for(i = indx1; i < len; i++){ 
     curr = exp[i]; 
     if(!isdigit(curr)){ 
      return --i; 
     } 
    } 
    return 0; 
} 

int getNumb(char* exp, int len, int* indx1){ 
    int indx2 = lastIndxOfNumb(exp, len, *indx1); 

    printf("indx1:%d\tindx2:%d\n", *indx1, indx2); 

    char temp[indx2-*indx1]; 
    strncpy(temp, exp+*indx1, (size_t) (indx2-*indx1+1)); 
    *indx1 = firstIndxOfNumb(exp, indx2+1, len); 
    return atoi(temp); 
} 

void main() { 
    char *s = "())(15*59"; 
    int len = strlen(s); 
    int indx1; 
    indx1 = firstIndxOfNumb(s, 0, len); 
    printf("%d\n", getNumb(s, len, &indx1)); 
    printf("\n%d", getNumb(s, len, &indx1)); 

} 

И цель получает два числа (15, 59). Первый вызов был в порядке, но второй не был «бесконечным циклом» со значениями index1: 7 okay index2: 0 не в порядке! Можете ли вы помочь мне сделать это работает .....
Значения выведенную printf(..); в getNum(); функции ....

+0

Вы можете использовать 'strtoi' вместо' atoi'. Он возвращает число _and_ количество прочитанных символов. Экономия времени для вас. –

+0

нет отрицательного числа в строке? – BLUEPIXY

+0

@BLUEPIXY Существует –

ответ

2

getNumb можно упростить следующим образом.

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 

int getNumb(char **sp){ 
    char *p = *sp; 
    while(*p && !isdigit((unsigned char)*p))//skip not digit 
     ++p; 
    if(!*p) 
     return -1;//not find numbers (Don't include negative numbers as extract numbers) 
    int ret = strtol(p, &p, 10); 
    *sp = p; 
    return ret; 
} 

int main(void) { 
    char *s = "())(15*59"; 
    char *sp = s; 
    printf("%d\n", getNumb(&sp)); 
    printf("%d\n", getNumb(&sp)); 
} 

Когда он содержит отрицательное число.

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <stdbool.h> 

bool getNum(char **sp, int *v /* out */){ 
    char *p = *sp; 
    while(*p && !isdigit((unsigned char)*p) && (*p!='-' || !isdigit((unsigned char)p[1])))//skip not number 
     ++p; 
    if(!*p) 
     return false;//not find numbers 
    *v = strtol(p, &p, 10); 
    *sp = p; 
    return true; 
} 

int main(void) { 
    char *s = "())(15*59+++-123,-2)"; 
    char *sp = s; 
    int v; 
    while(getNum(&sp, &v)) 
     printf("%d\n", v); 
} 
+0

превосходное упрощение. –

Смежные вопросы