我是初学者,我的英语不是那么对不起。即时尝试将字符串中的数字相加(对于a14fg5pk145,它返回14 + 5 + 145),它不起作用: "抛出异常:读取访问冲突。 str是0x61。"
这是我的代码:
void main()
{
int x, i;
char* pp;
char buffer[SIZE];
printf("Please enter numbers and letters:\n");
gets(buffer);
pp = buffer;
x = SumStr(*pp);
printf("%d", x);
}
int SumStr(char* str)
{
int sum=0, num=0, flag = 0;
while ((*str) != '\0')
{
while (((*str) > '1') && ((*str) < '9'))
{
if (flag == 0)
{
num += (*str);
flag = 1;
}
else if (flag == 1)
num = num * 10 + (*str);
str++;
}
if (flag == 0)
str++;
sum += num;
num = 0;
flag = 0;
}
return sum;
}
答案 0 :(得分:2)
您的代码导致异常的第一个问题。
x = SumStr(*pp);
应该是
x = SumStr(pp);
因为您应该通过附加asterix来传递字符串指针的地址而不是第一个字符。
不能使其发挥作用的第二个问题是。
num += (*str);
和
num = num * 10 + (*str);
通过(* str)实际上是在添加字符ascii值而不是数字。 这将通过将ascii值更改为数字来解决问题。
num += (*str) - '0';
num = num * 10 + (*str) - '0';
答案 1 :(得分:2)
这可能符合您的目的
#include<stdio.h>
#include<string.h>
int main()
{
int i, sum = 0, store;
char str[] = "a14fg5pk145asdasdad6";
int length = strlen(str);
for(i = 0; i < length; i++) {
store = 0;
while(isdigit(str[i])) {
store = (store * 10) + (str[i] - '0');
i++;
}
sum += store;
}
printf("%d\n", sum);
return 0;
}
输出
170
答案 2 :(得分:0)
将command -v ls
而非pp
传递给函数*pp
。 SumStr
的类型为*pp
,函数需要char
。事实上,您根本不需要char *
,只需将pp
作为参数传递。
此外:
Never use gets()。因为不知道这是不可能的 数据提前读取多少个字符(),因为 gets()将继续存储超过缓冲区末尾的字符 使用极其危险。它已被用来破坏计算机 安全。改为使用fgets()。