C:如何从没有strtol的字符串中提取数字

时间:2015-05-26 20:13:27

标签: c numbers extract

我在从字符串中提取数字时遇到问题。 问题是我可以不使用strtol或isdigit 这些功能。 我应该在 new array 中保存数字 例如,字符串输入:

  

11-some12meh13text-14


所以新阵列将是:

  

11,12,13,14

(NOT -14)
我开始想做以下事情:

char str1[150];
int array[20];
int temporary, i=0, j=0; //i - for string, j - for array

for(i=0;i<=strlen(str1);i++) {
    if(i==0) { //not needed to check if char before was number
        if((str1[i]>=0) && (str1[i]<=9))temporary=str1[i];
        if((str1[i+1]<=0) && (str1[i+1]>=9)) {//if next char is NOT number
            array[j]=temporary;
            j++;
        }
    }
    else if(i!=0) { //needs to be checked if char before was number
        if((str1[i]>=0) && (str1[i]<=9)) {
            if((str1[i-1]>=0) && (str1[i-1]<=9))temporary=temporary*10+str1[i];
            else temporary=str1[i];
            if((str1[i+1]<=0) && (str1[i+1]>=9)) {//if next char is NOT number
                array[j]=temporary;
                j++;
            }
        }
    }
}

我在我的电脑上尝试过,但程序崩溃,我不知道或有能力找到我做错了什么。 请帮忙! 谢谢!

2 个答案:

答案 0 :(得分:2)

字符'0'...'9'的整数值不是0...9

因此,请将str1[k]的每次出现更改为str1[k]-'0'

答案 1 :(得分:1)

如果允许使用sscanf(),这将解析整数的字符串。 %n说明符将报告扫描处理的字符数。这可以让你在字符串中移动。
扫描整数失败(!= 1)时,扫描集"%*[^0-9\n]%n"会扫描并丢弃不是数字或换行符的字符。 %n捕获处理的字符数。

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

int main ( ) {
    char str1[150] = {"0+1-=2!3*4-5/6#7&8|9^10"};
    int array[20] = {0};
    int offset = 0;
    int each = 0;
    int loop = 0;
    int used = 0;
    int length = 0;

    length = strlen ( str1);
    do {
        sscanf ( str1 + offset, "%*[^0-9\n]%n", &used);
        offset += used;
        if ( ( sscanf ( str1 + offset, "%d%n", &array[each], &used)) == 1) {
            offset += used;
            each++;
            if ( each >= 20) {
                break;
            }
        }
    } while ( offset < length);

    for ( loop = 0; loop < each; loop++) {
        printf ( "%d\n", array[loop]);
    }

    return 0;
}

以下是您的代码版本似乎可以正常工作

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

int main ( ) {
    char str1[150] = {"-0+1-=2!3*4-text-5/6#7&8|9^10 11end"};
    int array[20] = {0};
    int each = 0;
    int loop = 0;
    int saved = 1;
    int length = 0;
    int temporary = 0, i=0;

    length = strlen ( str1);
    for ( i = 0; i < length; i++) {
        if ( ( str1[i] >= '0') && ( str1[i] <= '9')) {//found a digit
            temporary = ( temporary * 10) + ( str1[i] - '0');
            saved = 0;//flag not saved. temporary value may change
        }
        else {//found NOT a digit
            if ( i > 0 && !saved) {//not at first character and not saved
                array[each] = temporary;//save integer
                each++;
                saved = 1;//flag saved
                temporary = 0;//reset
                if ( each >= 20) {
                    break;
                }
            }
        }
    }
    if ( !saved && each < 19) {//end of string is an integer. save it
        array[each] = temporary;
        each++;
    }
    for ( loop = 0; loop < each; loop++) {
        printf ( "%d\n", array[loop]);
    }

    return 0;
}