抛出异常:读取访问冲突

时间:2017-01-14 06:59:09

标签: c

我是初学者,我的英语不是那么对不起。即时尝试将字符串中的数字相加(对于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;
}

3 个答案:

答案 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传递给函数*ppSumStr的类型为*pp,函数需要char。事实上,您根本不需要char *,只需将pp作为参数传递。

此外:

  

Never use gets()。因为不知道这是不可能的          数据提前读取多少个字符(),因为          gets()将继续存储超过缓冲区末尾的字符          使用极其危险。它已被用来破坏计算机          安全。改为使用fgets()。

相关问题