我想只从字符串中提取数字,并将它们放在数组中。
例如,字符串为"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}
。有没有办法实现我的目标?
答案 0 :(得分:2)
那是算法:
Ex:我有字符串“ab34 56d1”
答案 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]);