如何在for循环中改变char*中的字符



嘿,伙计们,我有一个作业,我似乎无法解决。我得到一个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;
}

你试图修改字符串字面量,即只读内存:这就是你崩溃的原因(或未定义的行为更准确)

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?

convertToLower("Hello");

"Hello"const char[]型。自c++ 11以来,从const char*char*的转换是非法的,所以如果你使用的是现代版本,编译器应该告诉你一些事情,至少是一个警告。不能覆盖只读内存(const)。尝试这样做会导致未定义的行为。复制它并传入:

char copy[] = "Hello";
convertToLower(copy);

最新更新