理解C ++程序[Bjarne Stroustrup' s书]

时间:2015-10-26 19:12:52

标签: c++ string windows while-loop initialization

我需要你的宝贵帮助来解决一个小问题! 我正在阅读Bjarne Stroustrup的书,我发现了这个例子:

int main()
{
   string previous = " ";
   string current;

   while (cin >> current) {                                    
      if(previous == current)
        cout << "repeated word: " << current << '\n';
      previous = current;
   }                                                            
   return 0;
}

我的问题是: string previous =&#34; &#34;; 做什么?

它将之前的初始化为字符空间(就像按空格时一样)。但我认为在C ++中它没有读取它,有些东西是关于编译器跳过空白的。为什么要把它初始化呢?

我试着这样写: string previous; ,程序仍能正常工作......所以?有什么不同?请赐教x)

4 个答案:

答案 0 :(得分:4)

你会对C ++中忽略空格的含义感到困惑。在C ++中

sizeof(int)

的处理方式与

相同
std::string the_string = something;

否如果你有一个string literal,文字中的空格不会被忽略,因为它是字符串字符的一部分。所以

std::string      the_string=something          ;

创建一个带有一个空格的字符串,其中为

std::string foo = " ";

创建一个包含4个空格的字符串。

答案 1 :(得分:3)

你是对的,在使用std::cin阅读输入时,空白是你永远不会得到的。因此,previous字符串初始化为一个永远不会(即读取第一个单词时)可能与读入current字符串的单词匹配的值。

在这种情况下,previous也可能被初始化为空字符串,因为istream::operator>>会跳过所有空格,并且通过这种方式从std::cin读取,你永远不会得到空。但是,还有其他方法可以使用std::cin(例如与getline()一起使用),这可能会导致读取空字符串。

The book explains this example in every detail

答案 2 :(得分:1)

string previous = " ";

为字符串变量'previous'指定一个空格。

它可能仍然“有效”,但如果您只是在第一次尝试时按Enter键,则应显示“重复单词”消息。

答案 3 :(得分:1)

他可以写:)

string previous;

如果默认设置为跳过空格,则operator >>无法输入空字符串。

因此任何带有空字符串的比较current或包含空格的字符串都会产生false