【问题标题】:Confused by a part of a code被代码的一部分弄糊涂了
【发布时间】: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((*(&amp;c - sizeof(char))) == " ") 以及在这种情况下 *& 并将其设置为空白如何工作?

【问题讨论】:

  • 这个程序各种错误。
  • 我猜这段代码尝试检测前一个字符是否为空格,如果是,则将当前字符大写。但是,即使您展示的示例似乎没有表现出 UB(未定义的行为),您也应该小心使用此类函数,因为在数组的第一个元素上调用它 (或只是一个字符),实际上会显示 UB。编辑:我刚刚注意到正在进行的比较是 == " ",它几乎不会相等(并且可能会导致编译器警告),因为您正在比较 charchar*
  • @Algirdas Preidžius:代码格式错误,这意味着它是不可编译的(而传统的 C++ 编译器并不知道仅仅针对此类错误发出“警告”)。 OP 显然未能正确复制原始代码(这在Void 中也很明显)。真正的代码不可能有" "
  • 当您不理解您正在处理的代码时,您应该避免自己进行“简化”...将您的代码与链接中的原始代码进行比较,您已经引入了几个错误
  • @AnT 好吧,在我写下我的初始评论之后,我注意到他正在尝试与字符串进行比较,而不是与字符进行比较。而且,没有尝试编译,不知道这样的比较是否会引发警告或错误。在尝试编译它之后,我注意到它确实是一个错误。谢谢你纠正我。

标签: c++ string algorithm foreach


【解决方案1】:

在这种情况下...如何工作?

它不起作用。您显示的程序格式错误,不太可能编译。

Void printChars(char& c)

C++ 中没有 Void 类型。我怀疑你打算改写void

(some_char_value) == " " // expression simplified by me

您不能将字符与字符串文字进行比较。


但是他为什么用if((*(&amp;c - sizeof(char))) == " ")

他没有。他使用if( (*(&amp;c - sizeof(char))) == ' ')

& 在这种情况下如何工作?

它是地址运算符。这里用来获取一个临时指针,指向c的内存地址。

在这种情况下 * 是如何工作的?

它是间接运算符。此处用于获取内存位置&amp;c - 1 处的字符。这是str 中的一个字符,就在c 引用的字符之前。

并在这种情况下将其设置为空白工作?

他没有在引用的表达式中设置任何内容。 == 是相等比较运算符。他比较了&amp;c - 1 和字符文字' ' 的值。

英文:他测试c之前的字符是否是空格。换句话说:他测试c是否是单词的第一个字符。

【讨论】:

  • - 1 应该被使用而不是- sizeof(char) ...它们是等价的,因为标准定义了sizeof(char) == 1,但后者令人困惑并且损害了可读性
【解决方案2】:

这段代码正在执行简单的指针运算。您询问的代码是使用引用运算符&amp; 来获取变量c 的地址。然后执行减字符大小以检查 c 之前的字符是否为空格,如果是则调用toUpper()。比如

如果 c 的地址是 100,那么 &amp;c - sizeof(char) 正在检查地址 99 处的字符,那么 * 用于取消引用变量,从而允许使用 == " " 比较变量。

【讨论】:

    猜你喜欢
    • 2011-09-18
    • 2022-01-23
    • 2019-01-12
    • 1970-01-01
    • 2014-08-14
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    相关资源
    最近更新 更多