可能重复:
Why do I get a segmentation fault when writing to a string?
What is the difference between char a[] = “string”; and char *p = “string”;
我找到了错误,但我不知道为什么。那你能帮我吗?
如果我在main函数中定义了char str[]
而不是char * str
,它可以正常工作,否则*pSlow = *pFast;
的行会因"Unhandled exception at 0x012314f3 in shanchu.exe: 0xC0000005: Access violation writing location 0x0123583c."
而崩溃
由于
#include <stdio.h>
#include <string.h>
#include <iostream>
char * delChar(char *s,int iLen)
{
if((s == NULL) || iLen <= 0)
{
return NULL;
}
int i;
const int MAXLEN = 26;
unsigned int min,hashTable[MAXLEN];
for(i = 0;i < MAXLEN;i ++)
{
hashTable[i] = 0;
}
for(i = 0;i < iLen;i ++)
{
hashTable[*(s + i) - 'a'] ++;
}
while(hashTable[i] == 0)
{
i ++;
}
min = hashTable[i];
for(i = 0;i < MAXLEN;i ++)
{
if(hashTable[i] != 0)
{
if(hashTable[i] < min)
{
min = hashTable[i];
}
}
}
char *pSlow = s;
char *pFast = s;
while(*pFast != '\0')
{
if(hashTable[*pFast - 'a'] != min)
{
*pSlow = *pFast;
pSlow ++;
}
pFast ++;
}
*pSlow = '\0';
return s;
}
int main()
{
char* str = "abadccdehigiktk";
int iLen = strlen(str)/sizeof(char);
char *tmp = delChar(str,iLen);
printf("%s\n",tmp);
system("pause");
}
答案 0 :(得分:4)
char* str = "abadccdehigiktk";
不应修改 string-literal
。在您的函数delChar
中,您正尝试修改string-literal
。这是未定义的行为。
你应该使用
char[] str = "abadccdehigiktk";
或mb std::string
(因为你用C ++编写)。
答案 1 :(得分:1)
这一行
char* str = "abadccdehigiktk";
定义指向常量字符串的指针,即字符串不可以被修改。如果将其声明为数组(char str[]
),则它是堆栈中的数组,因此可以进行修改。
至于字符的删除,为什么不使用例如而是memmove
?
// "Delete" the fourth character of a string
memmove(str + 3, str + 4, strlen(str) - 3);
如果您使用std::string
,那么使用std::string::erase
突然很多:
std::string str = "abadccdehigiktk";
// Remove the fourth character
str.erase(3, 1);
您也不必担心指针与数组。
答案 2 :(得分:0)
这部分是完全错误的:
while(hashTable[i] == 0)
{
i ++;
}
min = hashTable[i];
for(i = 0;i < MAXLEN;i ++)
{
if(hashTable[i] != 0)
{
if(hashTable[i] < min)
{
min = hashTable[i];
}
}
}
首先i
尚未初始化,因此它将超出范围(由于之前的'for'循环,它最初将等于'iLen')。其次逻辑是乱七八糟的,你可以在一个循环中完成。我想你在这里尝试做的是:
min = UINT_MAX;
for (i = 0; i < MAXLEN; i++)
{
if (hashTable[i] > 0 && hashTable[i] < min)
{
min = hashTable[i];
}
}
即。在hashTable中找到最小的非零值。