在按下空格或制表符之前,如何从标准输入读取输入?

时间:2012-01-29 15:41:35

标签: c++

我需要从标准输入读取输入,直到按下空格或TAB。

最后,我需要在std::string对象中保存输入。

8 个答案:

答案 0 :(得分:4)

#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);
    }

}

答案 1 :(得分:3)

由于标签计为空格,因此您要求从流中提取第一个标记。这在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".
}

(错误只能在晦涩的情况下发生,例如,当程序启动时输入文件描述符已经关闭。)

答案 2 :(得分:2)

您可以使用getch()getchar()分别阅读每个字符,然后手动处理输入,以便在按下空格或制表符时结束输入。

答案 3 :(得分:1)

您可以std::cin使用

停止阅读任何指定的字符
char temp[100];
std::cin.getline(temp, 100, '\t');

我不知道你是否可以轻松地使用它来处理两个角色。

答案 4 :(得分:1)

这应该做的工作:

#include <stdio.h>

int main ()
{
  char c;
  do {
    c=getchar();
    /** Your code here **/
  } while ((c != ' ') && (c != '\t'));
  return 0;
}

答案 5 :(得分:1)

简单的答案是,你做不到。事实上,你提出问题的方式表明你不理解istream输入:istream中没有“按下”这样的东西,因为无法保证输入来自键盘。

您可能需要的是cursesncurses,它可以理解键盘输入;控制台输出和其余部分。

答案 6 :(得分:1)

使用scanf("%[^\t ]", buffer)似乎确实更容易解决这个问题。如果你想使用C ++ IOStreams,我认为最好用的选项是安装一个带有修改后的std::locale facet的std::ctype<char>,它使用对被认为是空格的修改解释然后读取一个std::string(参见我提出的类似问题的this answer)。无论您使用的是C还是C ++方法,如果您想要在输入时找到空格或制表符而不是在整个行被赋予程序时,您可能需要关闭标准输入的行缓冲。

答案 7 :(得分:0)

使用scanf:

一个简单的代码:

#include<iostream>
#include<stdio.h>
int main()
{
        char t[1000]={'\0'};
        scanf("%[^\t ]",t);
        printf("%s",t);
        std::string mains(t);
        return 1;

}