Можно ли передавать указатель на символ (после присвоения ему строки) в метод и изменять эту строку после использования массива и почему нет? - PullRequest
0 голосов
/ 12 мая 2019

Я хочу передать строку в функцию c, используя указатель на char и изменить ее, и это дало мне ошибку сегментации. Не знаю почему? Примечание *: я знаю, что могу передать строку в массив символов, это решит проблему

Я пытался передать его в массив символов и передать в функцию имя массива, и он работает, но мне нужно знать, в чем проблема передачи указателя на символ.

void convertToLowerCase(char* str){

    int i=0;
    while(str[i] != '\0')
    {
        if(str[i]>='A'&& str[i]<='Z'){
            str[i]+=32;
        }
        i++;
    }
}

int main(void){

    char *str = "AHMEDROSHDY";
    convertToLowerCase(str);
}

Я ожидаю, что выходной str будет "ahmedroshdy", но фактическая ошибка сегментации вывода

Ответы [ 2 ]

3 голосов
/ 12 мая 2019

Это (у вас было char str*, что является синтаксической ошибкой, исправили это):

char *str = "AHMEDROSHDY";

- указатель на строковый литерал , поэтому его нельзя изменить, так какон хранится в только для чтения памяти.

Здесь вы можете изменить его str[i]+=32;, что недопустимо.

Вместо этого используйте массив, как предложено @xing,т.е. char str[] = "AHMEDROSHDY";.

1 голос
/ 12 мая 2019

Чтобы быть более точным:

char *str = "AHMEDROSHDY";

'str` - указатель на строковый литерал.Строковые литералы в C не модифицируются

в стандарте C:

Поведение не определено в следующих обстоятельствах: ...

  • Программапытается изменить строковый литерал
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...