Я получаю сообщение об ошибке при попытке манипулировать элементами массива char в пользовательской функции - PullRequest
0 голосов
/ 10 января 2020

Я пытался манипулировать элементами строки "Hello World!" нашел в основной функции. Моя цель состоит в том, чтобы заглавные буквы "Hello World!" внутри функции «заглавные буквы», но это не позволяет мне. Я попытался вернуть строку, не манипулируя никакими ее элементами, и она работала нормально, но как только я включил часть кода, которая преобразует символ в нижнем регистре в символ в верхнем регистре, появляется ошибка времени выполнения, говорящая «Поток 1: EXC_BAD_ACCESS (code = 2, address = 0x100000fa9). Что не позволяет мне манипулировать массивом символов и что я должен сделать для его исправления?

char *capitalize(char *str)
{
    int i;

    for(i = 0; i < 4; i++)
        if(str[i] >= 'a' && str[i] <= 'z')
            str[i] -= 32; //I receive an error hear saying 
                          //Thread 1: EXC_BAD_ACCESS (code=2, address=0x100000fa9)

    return str;
}

int main()
{
    char string[40];

    printf("\n%s\n", strcpy(string, capitalize("abcd")));

    return 0;
}

Для справки, я включил SPECIFI C ПРОБЛЕМА В УЧЕБНИКЕ:

Задача 3.4. Реализовать char * Capitalize (char * str), который будет использовать строчные буквы в строке. Функции возвращает указатель на первый байт измененной строки. Например, вызов функции strcpy (string, Capitalize («Hello World!»)); скопирует «HELLO WORLD!» в качестве значения переменной строки.

1 Ответ

1 голос
/ 10 января 2020

Проблема в том, что capitalize("abcd") пытается изменить буквальную строку.

Все литеральные строки в действительности доступны только для чтения и не могут быть изменены. Попытка изменить буквенную строку приводит к неопределенному поведению .

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

char string[40] = "abcd";
printf("\n%s\n", capitalize(string));

С другой стороны, ваш код использует маги c чисел , что плохо, а также ваш код работает только с указанной кодировкой c (ASCII).

Чтобы сделать вашу программу переносимой, используйте функцию toupper:

char *capitalize(char *str)
{
    for(size_t i = 0; str[i] != '\0'; i++)
        str[i] = toupper(str[i]);

    return str;
}

Я также изменил условие l oop для проверки для строки с нулевым терминатором.

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