如何仅从字符串中提取数字?

时间:2015-11-28 14:13:14

标签: c arrays string

我想只从字符串中提取数字,并将它们放在数组中。

例如,字符串为"fds34 21k34 k25j 6 10j340ii0i5"

我想制作一个数组,其中的元素如下:

arr[0]=34, arr[1]=21, arr[2]=34, arr[3]=25, arr[4]=6, arr[5]=10, arr[6]=340, arr[7]=0, arr[8]=5;

我的试用代码:

#include <stdio.h>
int main()
{
    char ch;
    int i, j;
    int pr[100];
    i=0;
    while ( (ch = getchar()) != '\n' ){
        if( ch>='0' && ch<='9' ){
            pr[i] = ch-'0';
            i++;
    }
    for(j=0; j<i; j++)
        printf("pr[%d]: %d\n", j, pr[j]);
    return 0;
}

我的代码无法识别连续的数字。只是'pr'数组有{3, 4, 2, 1, 3, 4, 2, 5, 6, 1, 0, 3, 4, 0, 0, 5}。有没有办法实现我的目标?

4 个答案:

答案 0 :(得分:2)

那是算法:

  • 使用字符串存储当前号码。首先,将其初始化为空字符串
  • 当ch是数字('0'..'9')时,将其放在此字符串
  • 当ch不是数字时,如果字符串不为空,则通过 atoi 函数将当前字符串转换为数字,并将该数字存储在数组中。之后,将init当前字符串再次清空。

Ex:我有字符串“ab34 56d1”

  • 使用string str存储当前数字,首先是str =“”(空)
  • ch ='a',什么都不做(因为当前字符串为空)
  • ch ='b',什么都不做
  • ch ='3',把它放到字符串中,所以str =“3”
  • ch ='4',把它放到str,现在str =“34”
  • ch ='',将“34”转换为34,将其保存在数组中,init str =“”再次
  • .....

答案 1 :(得分:1)

这是一个有效的代码。我尝试3-4次它工作正常。 chPrevious将保持ch的先前状态。无需将数字存储到数字字符串中。为此,我们可以简单地使用整数。

#include<stdio.h>
#define NONDIGIT 'a'

int main() {
    char ch, chPrevious; //chPrevious hold the previous state of ch.
    chPrevious = NONDIGIT;
    int temp = 0;
    int pr[100];
    int i = 0;
    while ( (ch = getchar()) != '\n' ){
    if( (ch>='0' && ch<='9') && (chPrevious>='0' && chPrevious<= '9')){
        temp = temp * 10 + (ch - '0');
    } else if (ch>= '0' && ch<= '9' && temp != 0) {
        pr[i++] = temp;
        temp = 0;
        temp = ch - '0';
    } else if (ch >= '0' && ch <= '9') {
        temp = ch-'0';
    }
    chPrevious = ch;
    }
    pr[i++] = temp;
     for(int j=0; j<i; j++)
        printf("pr[%d]: %d\n", j, pr[j]);
    return 0;
}

可能还有其他办法,也有效率。请忽略不良造型。您还应该改进此代码。

答案 2 :(得分:1)

创建状态机

跟踪上一个字符 - 这是一个数字吗?

检测到数字时...
...如果继续数字序列,* 10并添加
......否则开始新序列

请勿过量填充pr[]

使用int ch正确检测EOF

//char ch;
int ch;
bool previous_digit = false;
int pr[100];
int i = 0 - 1;
while (i < 100 && (ch = getchar()) != '\n' && ch != EOF) {
  if (ch>='0' && ch<='9') {
    if (previous_digit) {
      pr[i] = pr[i] * 10 + ch - '0';
    } else {
      i++;
      pr[i] = ch - '0';
    }
    previous_digit = true;
  } else {
    previous_digit = false;
  }
}
i++;

答案 3 :(得分:1)

使用scanf。当您使用标准函数而不是编写自己的算法时,生活变得更加简单。

此代码使用scan读取一行用户输入,然后解析它。检测到的数字被放入一个数组中,搜索索引向前移动了数字位数。

char line[100];
int p[100];
int readNums = 0;
int readDigits = 0;
int len;
int index = 0;

//get line
scanf("%99[^\n]%n",line,&len);

while( index < len ){
    if(line[index] <= '9' && line[index] >= '0'){
        if(sscanf(line + index, "%d%n", p + readNums, &readDigits) != 1)
            fprintf(stderr, "failed match!!!! D:\n");
        index += readDigits;
        readNums++;
    }
    index++;
}

//print results
printf("read %d ints\n", readNums);

for(int i = 0; i < readNums; i++)
    printf("p[%d] = %d\n", i, p[i]);