我正在编写一个非常简单的程序,用于从字符串中删除重复的字符。我运行了visual studio并得到了错误:
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"
,但我仍然遇到同样的错误。
答案 0 :(得分:9)
您正在尝试修改字符串文字。你不能这样做。
char *str = "abcad";
这是一个字符串文字。它是在只读内存中创建的,因此尝试写入它是一种访问冲突。
答案 1 :(得分:6)
一个问题是您创建了一个只读字符串文字并试图修改它:
char *str = "abcad"; // String literals are read-only!
您可以使用char数组:
char str[] = "abcad";
答案 2 :(得分: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 ++。