被代码的一部分所困惑

时间:2017-01-31 00:30:29

标签: c++ string algorithm foreach

有一部分代码用于“使每个单词的首字母大写”我不明白。 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))) == " ")以及 * &amp; 如何将其设置为空白?

2 个答案:

答案 0 :(得分:3)

  

在这种情况下如何工作?

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

Void printChars(char& c)

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

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

您可能无法将字符与字符串文字进行比较。

  

但为什么他会使用if((*(&c - sizeof(char))) == " ")

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

  

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

是地址运营商。它用于获取指向c的内存地址的临时指针。

  

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

它是间接运算符。它用于在内存位置&c - 1获取字符。在str引用的字符之前c中的字符。

  

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

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

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

答案 1 :(得分:0)

此代码执行简单的指针运算。您要问的代码是使用引用运算符&来获取变量c的地址。然后执行减去char大小以检查c之前的char是否为空格,如果是,则调用toUpper()。例如,

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