从输入流一次读取一个单词到char数组?

时间:2014-12-20 18:55:18

标签: c++

我试图让我的程序一次读取一个单词,直到检测到“完成”一词。但是,我似乎无法正确使用语法,首先您可以看到我使用读取整行的getline函数。但这不是我想要的理想选择,所以我决定尝试使用cin.get,因为我知道它只读取输入,直到遇到空格或\ n。可悲的是,经过一次遍历后失败,让我可以输入任何东西......下面是我的源代码。

我的源代码:

#include <iostream>
#include <cstring>

int main()
{
    char ch[256];
    std::cout << "Enter words\n";
    std::cin.get(ch, 256);
    while(strcmp(ch, "done")!=0)
    {
        std::cin.getline(ch, 256); // this reads the entire input, not what I want
        // std::cin.get(ch, 256); this line doesn't work, fails after one traversal

    }
    return 0;

} 

示例运行:

用户输入:你好,我的名字已经完成

然后我的程序会将每个单词一次读入char数组,然后我在while循环中的测试条件会检查它是否有效。

截至目前,这不起作用,因为我正在使用getline,它读取整个字符串,只有在我自己键入字符串“done”时它才会停止..

3 个答案:

答案 0 :(得分:1)

std::istream::getline()std::istream::get()char数组版本)之间的区别在于前者不会提取终止字符。如果要读取格式化并在第一个空格处停止,则使用输入运算符。使用带有char数组的输入运算符时,请确保设置数组的宽度,否则会为程序创建潜在的溢出(和攻击向量):

char buffer[Size]; // use some suitable buffer size Size
if (std::cin >> std::setw(sizeof(buffer)) >> buffer) {
    // do something with the buffer
}

请注意,此输入运算符在到达空格或缓冲区已满时停止读取(其中一个char用于空终止符)。也就是说,如果你的缓冲区对于一个单词而言太小而且它以"done"结尾,你可能最终会检测到结束字符串,尽管它实际上并不存在。使用std::string

更容易
std::string buffer;
if (std::cin >> buffer) {
    // do something with the buffer
}

答案 1 :(得分:0)

#include <iostream>
#include <string>

int main()
{
    char ch[256];
    std::cout << "Enter words\n";
    std::cin.get(ch, 256);
    std::string cont;

    while (cont.find("done") == std::string::npos)
    {
        cont = ch;

        std::cin.getline(ch, 256); // this reads the entire input


    }




    return 0;
}

使用字符串更容易!

http://www.cplusplus.com/reference/string/string/find/

答案 2 :(得分:0)

#include <iostream>
#include <string>

int main()
{
    char ch[256];
    std::cout << "Enter words\n";

    std::string cont;

    while (cont.find("done") == std::string::npos)
    {



        std::cin.getline(ch, 256); // this reads the entire input
        cont = ch;

    }




    return 0;
}