我有一堆像这样的结构的字符串
Trim(2714,8256)++Trim(10056,26448)++Trim(28248,49165)
我想要做的是将所有数字保存到数组中(为了这个答案,我想说我想保存一个字符串的数字)。
我的计划是找到每个数字的第一个数字的位置,然后用sscanf读取数字,但是就我所想的那样,我找不到合适的方法。我已经阅读了很多关于strstr的内容,但它用于在另一个字符串中搜索字符串,因此我应该搜索确切的数字或者从10到9覆盖10个案例。
提前感谢您的支持!
答案 0 :(得分:3)
您可以尝试这样的事情:
isdigit
)strtoul
提取从该位置开始的数字
strtoul
返回号码endptr
)指向字符串中的下一个字符,跟随提取的数字 或者您可以tokenize字符串(使用"(,+)"
)并尝试strtoul
所有内容。
答案 1 :(得分:3)
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main() {
int arr[10], idx=0, d, l=0;
char *p, *str = "Trim(2714,8256)++Trim(10056,26448)++Trim(28248,49165)";
for (p = str; *p != 0; p+=l) {
l = 1;
if (isdigit(*p)){
sscanf(p, "%d%n", &d, &l);
arr[idx++] = d;
}
}
for (l=0; l<idx; l++) {
printf("%d\n", arr[l]);
}
return 0;
}
答案 2 :(得分:0)
您也可以尝试使用YACC或Lex,它会根据需要格式化您的字符串。
答案 3 :(得分:0)
以下是我对代码的看法:
- 启动源数组字符循环
- 如果当前位置(源数组)中的字符是数字
- 将其复制到目标数组(在目标数组的当前位置)
- 移动到目标数组中的下一个位置
- 移动到源数组中的下一个位置
- 如果到达源字符串的末尾,则退出循环
- 确保目标字符串正确终止(即通过'\ 0')
请注意,我们计算两个不同的计数器,一个用于源数组,每个循环迭代都会递增,另一个用于目标数组,只有在找到一个数字时才会递增
检查字符是否为数字可以使用函数“isdigit()”来完成,但它需要头文件ctype.h
检查字符是否为数字的另一种方法是检查其参考ASCII表的值 字符'0'等于48,字符'9'等于57.因此,如果字符在该范围内,则它是一个数字,否则它是一个字符。您实际上可以直接与字符进行比较。
if (character >= '0' && character =< '9') printf("%c is a digit", character);
答案 4 :(得分:0)
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main() {
int array[8], count=0, data;
const char *s = "Trim(+2714,8256)++Trim(10056,26448)++Trim(28248,49165)";
char *p;
while(*s) {
if(isdigit(*s) || *s=='-' && isdigit(s[1])){
data = strtol(s, &p, 10);
s = p;
array[count++] = data;
} else
++s;
}
{//test print
int i;
for(i=0;i<count;++i)
printf("%d\n", array[i]);
}
return 0;
}