【发布时间】:2017-01-31 00:30:29
【问题描述】:
我不明白“使每个单词的首字母大写”的代码的一部分。 http://www.cplusplus.com/forum/beginner/117463/
std::string str = x;
str [0] = toupper (str[0]);
std::for_each(str.begin()+1, str.end(), printChars);
std::cout << str;
return 0;
}
Void printChars(char& c)
{
if( (*(&c - sizeof(char))) == " ")
c = toupper(c);
}
我知道它总是将第一个字母设置为大写,然后检查字符串中的每个字母。
但他为什么使用if((*(&c - sizeof(char))) == " ") 以及在这种情况下 * 、 & 并将其设置为空白如何工作?
【问题讨论】:
-
这个程序各种错误。
-
我猜这段代码尝试检测前一个字符是否为空格,如果是,则将当前字符大写。但是,即使您展示的示例似乎没有表现出 UB(未定义的行为),您也应该小心使用此类函数,因为在数组的第一个元素上调用它 (或只是一个字符),实际上会显示 UB。编辑:我刚刚注意到正在进行的比较是
== " ",它几乎不会相等(并且可能会导致编译器警告),因为您正在比较char和char*。 -
@Algirdas Preidžius:代码格式错误,这意味着它是不可编译的(而传统的 C++ 编译器并不知道仅仅针对此类错误发出“警告”)。 OP 显然未能正确复制原始代码(这在
Void中也很明显)。真正的代码不可能有" "。 -
当您不理解您正在处理的代码时,您应该避免自己进行“简化”...将您的代码与链接中的原始代码进行比较,您已经引入了几个错误
-
@AnT 好吧,在我写下我的初始评论之后,我注意到他正在尝试与字符串进行比较,而不是与字符进行比较。而且,没有尝试编译,不知道这样的比较是否会引发警告或错误。在尝试编译它之后,我注意到它确实是一个错误。谢谢你纠正我。
标签: c++ string algorithm foreach