Необработанное исключение при работе с cstrings

Возможный дубликат:
Почему при записи в строку возникает ошибка сегментации?
В чем разница между 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");

}

0

Решение

char* str = "abadccdehigiktk";

string-literal не должны быть изменены. В вашей функции delChar вы пытаетесь изменить string-literal, Это неопределенное поведение.

Вы должны использовать

char[] str = "abadccdehigiktk";

или мб std::string (поскольку вы пишете на C ++).

4

Другие решения

Эта линия

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

Вам также не нужно беспокоиться об указателях или массивах.

1

Эта часть совершенно не так:

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 не был инициализирован, поэтому он будет вне диапазона (изначально он будет равен ‘iLen’ из-за предыдущего цикла ‘for’). Во-вторых, логика беспорядок, и вы можете сделать это всего за один цикл. Я думаю, что вы, вероятно, пытаетесь сделать здесь:

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

найти минимальное ненулевое значение в hashTable.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector