我需要从标准输入中读取输入,直到按下空格或TAB键。
最终,我需要将输入保存在std::string
对象中。
#include <iostream>
#include <string>
int main()
{
std::string result;
std::cin >> std::noskipws; //don't skip whitespaces
char c;
while (std::cin >> c)
{
if(c == '\t' || c == ' ')
break;
result.push_back(c);
}
}
由于制表符被视为空格,因此您要求从流中提取第一个标记。在C++中,这非常容易,因为标记提取已经是>>
运算符的默认行为:
#include <iostream>
#include <string>
int main()
{
std::string token;
if (!(std::cin >> token)) { /* error */ return 1; }
// now you have the first token in "token".
}
getch()
或getchar()
来逐个读取每个字符,然后手动处理输入,以便在按下空格或制表符时结束输入。getch
是特定于平台的; 在大多数平台上不存在。getchar
相当于 std::cin.get()
,正如原始帖子中的一些评论所指出的那样,大多数系统在按下回车键之前不会返回任何内容。 - James Kanze这应该可以完成工作:
#include <stdio.h>
int main ()
{
char c;
do {
c=getchar();
/** Your code here **/
} while ((c != ' ') && (c != '\t'));
return 0;
}
std::string
,并附加每个字符(您可以使用重载的 +=
运算符)。 - nikolasstr.push_back(c)
。 - Dr G您可以使用std::cin
在任何指定字符处停止读取。
char temp[100];
std::cin.getline(temp, 100, '\t');
我不知道你是否可以轻松地让它与两个字符一起工作。
std::getline()
版本,它接受一个谓词作为第三个参数,并针对其进行测试,而不是换行符。 - André Caron看起来,使用scanf("%[^\t ]", buffer)
解决这个问题确实更容易。如果您想使用C++ IOStreams进行操作,我认为最好的选择是安装一个带有修改过的std::ctype<char>
facet的std::locale
,该facet使用修改后的空格解释方式,然后读取一个std::string
(例如,请参见我为类似问题提供的this answer)。无论您是使用C还是C++方法,如果要在输入标准输入时查找空格或制表符而不是在整行输入时查找,您可能需要关闭标准输入上的行缓冲。
使用scanf来实现:
一个简单的代码:
#include<iostream>
#include<stdio.h>
int main()
{
char t[1000]={'\0'};
scanf("%[^\t ]",t);
printf("%s",t);
std::string mains(t);
return 1;
}
istream
输入:在istream
中没有“pressed”这样的东西,因为无法保证输入来自键盘。curses
或ncurses
,它们可以理解键盘输入、控制台输出和其他内容。std::cin
也可以。当然,我们可能不知道它是否连接到键盘,但我们可能不在意:只需调用系统调用,不要对其结果过于挑剔。 - Dietmar Kühlcurses
。问题是它们只能在特定的系统上运行。据我所知,在 Windows 下,规避行缓冲的唯一方法是使用不同的系统调用。(但是,我对 Windows 的了解不是很深入,可能会有我所不知道的东西。) - James Kanze
ncurses
。 - Kerrek SB