【问题标题】:Exception thrown: read access violation抛出异常:读取访问冲突
【发布时间】:2017-01-14 16:02:45
【问题描述】:

我是初学者,我的英语不太好,所以先抱歉。我试图对字符串中的数字求和(对于 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;
}

【问题讨论】:

  • 另一个建议:((*str) &gt; '1') &amp;&amp; ((*str) &lt; '9')isdigit(*str)。不要重新发明轮子,使用标准库。
  • 你的数字中不计算零吗?实际上,你排除了019,这有点不寻常。
  • SO 不是调试服务。使用符号编译,在调试器中运行代码以逐行跟踪程序,检查相关变量的值以了解实际情况。如果出现具体问题,请随时返回此处。

标签: c


【解决方案1】:

导致异常的代码的第一个问题。

x = SumStr(*pp);

应该是

x = SumStr(pp);

因为你应该通过附加星号传递字符串指针的地址而不是它的第一个字符。

第二个不能让它工作的问题是。

num += (*str);

num = num * 10 + (*str);

通过 (*str) 您实际上是在添加字符 ascii 值而不是数字。 这将通过将 ascii 值更改为数字来解决问题。

num += (*str) - '0';

num = num * 10 + (*str) - '0';

【讨论】:

  • 0 指望我的数字,我忘了...谢谢你的回答!
【解决方案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

【讨论】:

    【解决方案3】:

    pp(而不是*pp)传递给函数SumStr*pp 的类型为 char,函数需要 char *。事实上,你甚至根本不需要pp,只需将buffer 作为参数传递即可。

    还有:

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

    【讨论】:

    • 代码应该在与完整原型一起使用之前声明SumStr(),或者将其定义移到main()之前,以便编译器可以发现函数的滥用。就目前而言,它的双手被束缚;不允许报告故障。
    猜你喜欢
    • 2018-05-19
    • 2021-05-01
    • 2021-12-19
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多