为了更多地了解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;
答案 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
}
见这些:
来自Wiki:
在C和C ++编程语言中,逗号运算符(由标记表示)是一个二元运算符,它计算第一个操作数并丢弃结果,然后计算第二个操作数并返回该值(和类型)。逗号运算符具有任何C运算符的最低优先级,并充当序列点。