Место записи нарушения прав доступа 0x0133585B Ошибка - PullRequest
0 голосов
/ 04 февраля 2019

Я работаю над программой на C, и следующая функция принимает три параметра и заменяет символ в строке другим символом.Ну, большинство из них работает просто отлично, но я получаю ошибку при попытке выполнить эту часть кода: str [pos] = ch ;.Ошибка говорит: «Запись о нарушении прав доступа 0x0133585B.»

void kstrput(char *str, size_t pos, char ch)
{
    if(pos > strlen(str))
    {
        abort();
    }
    str[pos] = ch;
}

Часть основного:

char *kstr = "hello";
    int pos = 3;
    char s = '\0';
    printf("\n Enter a character ");
    scanf("%c", &s);
    kstrput(kstr,pos,s); // calling the kstrput function
    printf("\n After kstrput: %s",kstr); //printing the struct to check value of the string

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

"hello" является константой (не изменяемой) и может (и, вероятно, хранится) храниться в постоянном запоминающем устройстве.

Надлежащим способом указать на него является использование указателя типа const char *.В вашем случае вам нужно определить массив char и инициализировать его как "привет":

char kstr[] = "hello";

Также обратите внимание, что в kstrput, если pos равно strlen(str)тогда он переопределит '\0', который указывает конец строки.Лучшее использование:

if(pos >= strlen(str))
0 голосов
/ 04 февраля 2019

Эта строка в функции void kstrput (char * str, size_t pos, char ch)

if(pos > strlen(str))

должна быть заменена на

if(pos >= strlen(str))
0 голосов
/ 04 февраля 2019

"Место записи о нарушении прав доступа 0x0133585B."

вы делаете

{
  int pos = 3;
  ...
  char *kstr = "hello";
  ...
  kstrput(kstr,pos,s); // calling the kstrput function
}

void kstrput(char *str, size_t pos, char ch)
{
   str[pos] = ch;
   ...
}

в str[pos] = ch; pos , значение 3 является действительныминдекс, но str - строковый литерал "hello", строковый литерал нельзя изменить

...