修改c字符串[重复]

Posted

技术标签:

【中文标题】修改c字符串[重复]【英文标题】:Modifying a c string [duplicate] 【发布时间】:2015-03-22 15:02:28 【问题描述】:

我正在尝试实现tolower(char *) 函数,但出现访问冲突错误。我知道这是因为编译器将字符串文字存储在只读内存中。这是真的? 这是一些代码:

char* strToLower(char *str)

    if(str == nullptr)
        return nullptr;

    size_t len = strlen(str);
    if(len <= 0)
        return nullptr;

    for(size_t i = 0; i < len; i++)
        *(str+i) = (char)tolower(*(str+i));//access violation error

    return str;


int main()

    char *str = "ThIs Is A StRiNgGGG";

    cout << strToLower(str) << endl;

    system("pause");
    return 0;

如果这是真的,我应该如何实现这样的功能?

【问题讨论】:

【参考方案1】:

是的,这是真的。您不能修改字符串文字。事实上,如果你的编译器不是 1922 年的,它甚至会阻止你首先获得指向字符串文字的非const 指针。

你没有说明你的目标,所以当你问“我应该如何实现这样的功能”时,你并不清楚你想做什么。但是您可以制作字符串文字的 copy 以获取您自己的字符串,然后随意修改:

// Initialises an array that belongs to you, by copying from a string literal
char str[] = "ThIs Is A StRiNgGGG";

// Obtains a pointer to a string literal; you may not modify the data it points to
const char* str = "ThIs Is A StRiNgGGG";

// Ancient syntax; not even legal any more, because it leads to bugs like yours
char* str = "ThIs Is A StRiNgGGG";

当然,因为这是 C++,所以你不应该首先使用 C 字符串:

std::string str("ThIs Is A StRiNgGGG");

【讨论】:

我将字符串文字设为非常量,所以我想我可以修改它。那么您是否声称一个函数不能采用char* 并根据需要修改每个字符? @Pilpel:如果 char* 指向字符串文字,那么,不,它不能。正如我在回答中明确指出的那样。 字符串文字不能修改。哎呀,你自己在你的问题中说过! 我明白了。所以我想我应该坚持使用 std 字符串,尽管我在使用它们时总是有这种烦人的感觉,因为(在我看来)它们似乎占用更多空间并使我的应用程序比使用 c 字符串更慢。 @Pilpel:这是错误的(模动态分配)!不过,我理解直觉。 “物体”总是感觉更重,即使它们不是。

以上是关于修改c字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

字符串处理总结之二(C#StringBuilder类)

创建和修改自定义字符串 [重复]

使用指针算术修改字符串文字或字符数组[重复]

纠错:C语言:删除重复字符。

C语言 输入一个字符串 去掉重复的字符,输出无重复的

如何删除重复字符c语言