6

我正在编写一个非常简单的程序,可以从字符串中删除重复的字符。我运行了它的视觉工作室并得到了错误:

inteviews.exe 中 0x00d110d9 处未处理的异常:0xC0000005:访问冲突写入位置 0x00d27830。

我真的不明白问题是什么。当前单元格获取下一个单元格的值。

void remove(char *str, char a) {
    while (*str != '\0') {
        if (*(str+1) == a) {
            remove(str + 1, a);
        }

        *str = *(str +1 );//HERE I GET THE ERROR
        ++str;
    }
}


int _tmain(int argc, _TCHAR* argv[])
{
    char *str = "abcad";

    while (*str != '\0') {
        remove(str,*str);
        str++;
    }

    std::cout << str << std::endl;

    return 0;
}

编辑:

我已经尝试将其更改为,char str[] = "abcad"但仍然出现相同的错误。

4

3 回答 3

10

您正在尝试修改字符串文字。你不能那样做。

char *str = "abcad";

那是一个字符串文字。它是在只读内存中创建的,因此尝试写入它是访问冲突。

于 2011-12-10T18:59:02.527 回答
6

一个问题是您创建了一个只读字符串文字并尝试对其进行修改:

char *str = "abcad"; // String literals are read-only!

您可以改用 char 数组:

char str[] = "abcad";
于 2011-12-10T19:00:11.827 回答
3

你的程序有各种各样的问题。我开始尝试把它们都写下来,但我觉得代码是不可救药的。它有索引错误、参数传递错误、可疑递归等。

指出尝试修改只读文字错误的其他答案是正确的。这就是您发布的代码中出现错误的原因。

在我看来,您遇到麻烦的主要原因是,当您只有一个缓冲区时,代码更难编写。您已经陷入困境,试图在您的设计中绕过这个限制,但是使用第二个缓冲区,代码是微不足道的。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    const char *input = "abcad";
    char *output = malloc(strlen(input)+1);

    char *in = input;
    char *out = output;
    while (*in)
    {
        if (*in != input[0])
        {
            *out = *in;
            out++;
        }
        in++;
    }
    *out = '\0';

    printf("%s\n", output);

    free(output);

    return 0;
}

如果您想变得非常聪明,实际上只需一个缓冲区即可愉快地管理,只要您保留两个不同的指针进行迭代。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char str[] = "abcad";
    char compare = str[0];

    char *in = str;
    char *out = str;
    while (*in)
    {
        if (*in != compare)
        {
            *out = *in;
            out++;
        }
        in++;
    }
    *out = '\0';

    printf("%s\n", str);

    return 0;
}

请注意,我们必须在缓冲区中获取第一个字符的副本,该字符被删除,因为它可能会被迭代修改。

所以现在你回到了你开始的地方,只有一个缓冲区。但是现在代码可以工作并且很容易理解。

请注意,我的答案是根据您的标签用 C 编写的,但请注意您的代码是 C++。

于 2011-12-10T19:11:10.327 回答