С++ Как изменить символ в цикле char * in for

Эй, ребята, у меня есть задание, которое я, похоже, не могу решить. Я получаю строку char *, и мне нужно сделать все буквы верхнего регистра (все в ASCII) для нижнего регистра с использованием битовых операций. Я добавляю свой код, но он продолжает сбой.

#include <iostream>
#include <cstring>

using namespace std;

void convertToLower(char* string)
{
   for (unsigned int i = 0; i < strlen(string); i++)
   {
       if (string[i] >= 65 && string[i] <= 90)
       {
           string[i] |= 32;
       }
   }
   cout << string << endl;
}
int main()
{
   convertToLower("Hello");
   return 0;
}
0
источник поделиться
2 ответа

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

void convertToLower(char* str)
{
   for (unsigned int i = 0; i < strlen(str); i++)
   {
       if (str[i] >= 65 && str[i] <= 90)
       {
           str[i] |= 32;
       }
   }
   cout << str << endl;
}

int main() {

    char arr[] = "STRING";
    convertToLower(arr); // Fine

    char *readonly = "READONLY";
    convertToLower(readonly); // Nope
}

Я предполагаю, что недавний компилятор также должен был предупредить вас об этом (Wwritable-strings).

Подробнее об этой проблеме читайте здесь: почему строковые литералы const?

+3
источник
convertToLower("Hello");

"Hello" имеет тип const char[]. Преобразование из const char* в char* было незаконным с С++ 11, поэтому ваш компилятор должен был сказать вам что-то об этом, если вы используете современное, по крайней мере, предупреждение. Вы не можете перезаписать постоянную память (const). Попытка сделать это приводит к неопределенному поведению. Сделайте копию и передайте это в:

char copy[] = "Hello";
convertToLower(copy);
+2
источник

Посмотрите другие вопросы по меткам или Задайте вопрос