【问题标题】:c++ How to change a character in char* in for loopc ++如何在for循环中更改char *中的字符
【发布时间】:2016-11-17 14:59:12
【问题描述】:

大家好,我有一个我似乎无法解决的任务。我得到一个 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;
}

【问题讨论】:

  • 你怎么称呼它?你要传递给它什么?
  • ideone.com/53laPq 对我来说一切都好。您可能通过提供字符串文字来调用它,不要这样做。那是只读存储器。
  • 还要确保你的字符串是空终止的。
  • edit您的问题提供minimal reproducible example
  • 与您的问题没有直接关系:不要使用幻数。 65 -> 'A', 90 -> 'Z'

标签: c++ char


【解决方案1】:

您正在尝试修改字符串文字,即只读内存:这就是您崩溃的原因(或者更准确地说是未定义的行为)

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)。

在此处阅读有关此问题的更多信息:Why are string literals const?

【讨论】:

  • 它有效,您可以给我发一份指南,了解整个* 的含义吗?
  • @Rokni 添加了一个链接,以防您想了解有关字符串文字的更多信息以及它们为什么是只读的
【解决方案2】:
convertToLower("Hello");

"Hello" 的类型为 const char[]。自 C++11 以来,从 const char*char* 的转换一直是非法的,因此如果您使用的是现代编译器,您的编译器应该会告诉您一些相关信息,至少是一个警告。您不能覆盖只读内存 (const)。试图这样做会导致未定义的行为。将其复制并传递:

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

【讨论】:

    猜你喜欢
    • 2019-04-15
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 2021-10-11
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多