char到大写赋值分段错误

时间:2011-04-17 02:46:22

标签: c++ char segmentation-fault uppercase

为了更多地了解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;

2 个答案:

答案 0 :(得分:6)

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

C ++中的while循环采用单个表达式。它会在每次迭代时评估该表达式,以确定是否继续。

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

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

你的循环会更加清晰for循环:

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

答案 1 :(得分:4)

while循环更改为:

while(*c != 0){
            if((*c >= 'a') && (*c <= 'z')){
                *c = *c - 32;                    
                std::cout << *c << std::endl;

            }
             c++; // Should be here
        }

见这些:

  1. Your code

  2. Edited Code

  3. 来自Wiki

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