使用cstrings时出现未处理的异常

时间:2012-09-11 05:36:42

标签: c++ c char

  

可能重复:
  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");

}    

3 个答案:

答案 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中找到最小的非零值。