4

为了进一步了解 c++ 的内部工作原理,我决定编写自己的字符串类。但是我被困在.toUpper()and.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;
4

2 回答 2

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

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

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

由于您一直在递增c,因此条件 neverfalse因为cnever 变为NULL(请注意,在编写时它不是在测试指向的值,而是在测试指针本身)。

你的循环会像for循环一样干净:

for (; *c != 0; ++c)
于 2011-04-17T03:05:34.950 回答
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 运算符中具有最低优先级,并充当序列点。

于 2011-04-17T02:54:29.953 回答