将字符转换为大写字母的赋值操作导致分段错误

4

为了更好地了解c++的内部机制,我决定编写自己的字符串类。然而,我卡在了 .toUpper().toLower() 函数上。以下是我的代码。

Text& toUpper(){
        char* c = this->str;
        while(*c != 0, c++){
            if((*c >= 'a') && (*c <= 'z')){
                *c = *c - 32;                    
                std::cout << *c << std::endl;
            }
        }
        return *this;
    }

我已经找到了导致分段错误的代码行:*c = *c - 32,但我不知道为什么会导致问题。我尝试使用 (char)(*c - 32),但没有效果。而且这不是边界问题,因为没有任何输出。有什么想法吗?
更新:我的构造函数。
Text(char* str){
        this->str = str;
        this->updateLength(); // glorified strlen
    }

我的指针定义

private:
    char* str;
    int len;

问题出在 while 循环的条件中的 c++ - Sadique
2个回答

5
while(*c != 0, c++)

在C++中,while循环接受一个表达式。每次迭代时,它都会评估该表达式以确定是否继续执行。

这里的,是逗号运算符,而不是分隔符。逗号运算符评估第一部分(*c != 0),丢弃结果,然后评估第二部分(c++)并将其作为其结果。

由于您不断增加c,因此条件永远不会变为false,因为c永远不会变为NULL(请注意,正如所写的那样,它并未测试指向的值,而是测试指针本身)。

您的循环可以使用for循环更简洁:

for (; *c != 0; ++c)

3
将您的 while 循环更改为以下内容:
while(*c != 0){
            if((*c >= 'a') && (*c <= 'z')){
                *c = *c - 32;                    
                std::cout << *c << std::endl;

            }
             c++; // Should be here
        }

请查看以下内容:

  1. 您的代码

  2. 修改后的代码

根据维基百科的解释:

在C和C++编程语言中,逗号运算符(由标记,表示)是一个二元运算符,它评估其第一个操作数并丢弃结果,然后评估第二个操作数并返回此值(和类型)。逗号运算符具有任何C运算符的最低优先级,并充当序列点。


"c++, *c != 0" 是不正确的。考虑字符串为空("")时会发生什么。 - James McNellis
我不明白。当char被声明为数组时,您的代码完美运行,但当它被声明为指针时会导致seg-fault。我声明指针的方式有误吗?我会更新我的问题。 - user415715
@Nat:str 存储的是什么?str 是指向字符串字面值还是字符数组的指针?修改字符串字面值是未定义行为。 - Sadique
Acme,那就是问题所在。谢谢。我忘记将字符串字面量指针复制到数组中了。 - user415715

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接