0

重複の可能性:
文字列への書き込み時にセグメンテーション違反が発生するのはなぜですか?
char a[] = “string”; の違いは何ですか? および char *p = 「文字列」;

障害を見つけましたが、理由がわかりません。私を助けてくれませんか?

メイン関数で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");

}    
4

3 に答える 3

4
char* str = "abadccdehigiktk";

string-literal変更しないでください。関数delCharで を変更しようとしていますstring-literal。これは未定義の動作です。

使用する必要があります

char[] str = "abadccdehigiktk"; 

または mb std::string(C++ で書いているため)。

于 2012-09-11T05:39:29.010 に答える
1

この行

char* str = "abadccdehigiktk";

定数文字列へのポインタを定義します。つまり、文字列は変更できません。配列 ( ) として宣言するとchar str[]、スタック上の配列になるため、変更できます。

文字の削除については、memmove代わりに eg を使用してみませんか?

// "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);

また、ポインターと配列について心配する必要もありません。

于 2012-09-11T05:41:12.017 に答える
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」と等しくなります)。次に、ロジックがごちゃごちゃしていて、これを 1 回のループで実行できます。おそらくここでやろうとしていることは次のとおりだと思います。

min = UINT_MAX;
for (i = 0; i < MAXLEN; i++)    
{
    if (hashTable[i] > 0 && hashTable[i] < min)
    {
        min = hashTable[i];
    }
}

つまり、hashTable でゼロ以外の最小値を見つけます。

于 2012-09-11T05:40:28.340 に答える