我试图让我的程序一次读取一个单词,直到检测到“完成”一词。但是,我似乎无法正确使用语法,首先您可以看到我使用读取整行的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”时它才会停止..
答案 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;
}
使用字符串更容易!
答案 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;
}