C++中CIN的功能

C++中CIN的功能,c++,C++,我对以下函数的结果有点困惑: int main() { string command; while(1) { cin >> command; if(command == "end") return 0; else cout << "Could you repeat the command?" << endl; } return 0; string command; getline(

我对以下函数的结果有点困惑:

int main() {
string command;
while(1) {
    cin >> command;

    if(command == "end")
            return 0;
    else
            cout << "Could you repeat the command?" << endl;
}

return 0;
string command;
getline( cin, command );
}

首先-输出线你能。。。对存储在命令中的输入中的每个单词重复一次。就我所见,循环的每个实例只可能发生一次

此外,当行“ifcommand==end”更改为“ifcommand==that”时,它不会触发。一个小测试表明,所有的空白都已从命令中删除

有人能给我解释一下这里发生了什么事吗


谢谢

格式化输入操作符>>从输入中读取空格分隔的令牌。如果要读取整行,请使用getline函数:

int main() {
string command;
while(1) {
    cin >> command;

    if(command == "end")
            return 0;
    else
            cout << "Could you repeat the command?" << endl;
}

return 0;
string command;
getline( cin, command );

格式化输入运算符>>从输入中读取空格分隔的标记。如果要读取整行,请使用getline函数:

int main() {
string command;
while(1) {
    cin >> command;

    if(command == "end")
            return 0;
    else
            cout << "Could you repeat the command?" << endl;
}

return 0;
string command;
getline( cin, command );

最有可能的是所有操作系统都会缓冲输入。当您键入一串单词,然后点击[enter]时,通常只有在点击enter时,输入才会传递给您的程序。因此,此时它将开始读取输入并将其分离为单个单词,因为正如Neil提到的那样,>>读取单词,而不是行。因此,即使只按一次enter键,您的程序也会对行中的每个单词多次循环一次

所以,你是正确的,当你认为它应该只显示你可以。。。每个循环一次。这就是正在发生的事情


同样,由于使用空格分隔符,您永远不会有包含多个单词的命令。如前所述,使用getline检索输入行的整个文本。

很可能是所有操作系统缓冲区输入。当您键入一串单词,然后点击[enter]时,通常只有在点击enter时,输入才会传递给您的程序。因此,此时它将开始读取输入并将其分离为单个单词,因为正如Neil提到的那样,>>读取单词,而不是行。因此,即使只按一次enter键,您的程序也会对行中的每个单词多次循环一次

所以,你是正确的,当你认为它应该只显示你可以。。。每个循环一次。这就是正在发生的事情


同样,由于使用空格分隔符,您永远不会有包含多个单词的命令。如前所述,使用getline检索输入行的整个文本。

Woah。很多事情。首先,您需要使用getline,因为在从iostream读入时,任何空格都是默认的分隔符。您还需要注意,当您执行string==常量字符串时,您正在默默地将常量字符串强制转换为string对象。如果您碰巧有一个C字符串,比如调用command.C_str,您希望使用strcmp来比较字符串是否相等,而不是==,因为==通常会比较引用字符串的地址。@编译器-这两条注释是最好的答案,但您应该在注释中公布+1。特别是在测试带有==。@的字符串时,将std::string与string文本进行比较并不一定会创建新的string对象。标准库提供了运算符==char const*、字符串和运算符==string、char const*,以及一些字符串::的重载,比较它们在字符指针上的工作。@Rob很高兴知道!谢谢你的教诲。很多事情。首先,您需要使用getline,因为在从iostream读入时,任何空格都是默认的分隔符。您还需要注意,当您执行string==常量字符串时,您正在默默地将常量字符串强制转换为string对象。如果您碰巧有一个C字符串,比如调用command.C_str,您希望使用strcmp来比较字符串是否相等,而不是==,因为==通常会比较引用字符串的地址。@编译器-这两条注释是最好的答案,但您应该在注释中公布+1。特别是在测试带有==。@的字符串时,将std::string与string文本进行比较并不一定会创建新的string对象。标准库提供了运算符==char const*、字符串和运算符==string、char const*,以及一些字符串::的重载,比较它们在字符指针上的工作。@Rob很高兴知道!谢谢你的教诲。谢谢,那很好用。出于好奇,“cin”在getline函数中指的是什么?getline可以为第一个参数使用哪些可选参数?任何您喜欢的inputstream。它可以是内存中的数据、数据库、网络连接或任何东西。还有一个cin.getline成员function@wyattcin是istream类型的对象,它封装了对程序标准输入的访问。您可以将其替换为任何类型为istream或派生类型(如文件流)的对象。谢谢,这非常有效。出于好奇,“cin”在getline函数中指的是什么?W
getline可以为第一个参数使用哪些可选参数?任何您喜欢的inputstream。它可以是内存中的数据、数据库、网络连接或任何东西。还有一个cin.getline成员function@wyattcin是istream类型的对象,它封装了对程序标准输入的访问。您可以将其替换为任何类型为istream或派生类型(如文件流)的对象。