【问题标题】:How to cin Space in c++?如何在 C++ 中输入空间?
【发布时间】:2011-02-15 11:11:04
【问题描述】:

假设我们有一个代码:

int main()
{
   char a[10];
   for(int i = 0; i < 10; i++)
   {
       cin>>a[i];
       if(a[i] == ' ')
          cout<<"It is a space!!!"<<endl;
   }
   return 0;
}

如何从标准输入中输入空格符号?如果你写空格,程序会忽略! :( 是否有任何符号组合(例如 '\s' 或类似的东西)表示“空格”,我可以从标准输入中为我的代码使用?

【问题讨论】:

  • 据我所知,空格(空格?)用于分隔不同的输入。可能您需要使用 char *Line;获得包含空间的空间。
  • 请将&lt;&lt;&lt; 更改为&lt;&lt; 并使用== 来测试是否相等。这些错别字分散了答案的注意力。
  • 注意:术语命令行在这里并不真正相关。命令行被转换为参数传递给 main() 作为 argv 参数。 std::cin 从标准输入读取(默认连接到用户键盘)。

标签: c++ spaces cin


【解决方案1】:

默认情况下,它会跳过所有空格(空格、制表符、换行符等)。您可以更改其行为,或使用稍微不同的机制。要更改其行为,请使用操纵器noskipws,如下所示:

 cin >> noskipws >> a[i];

但是,由于您似乎想查看单个字符,我建议您在循环之前使用 get,就像这样

 cin.get( a, n );

注意:如果get 找到换行符 (\n) 或在 n-1 个字符之后,它将停止从流中检索字符。它提前停止,以便可以将空字符 (\0) 附加到数组中。您可以阅读有关istream 接口here 的更多信息。

【讨论】:

  • @dylnmc 你读过这篇文章吗?那么,您会注意到,我声明 cin.get 从流中返回 n - 1 字符。
  • @dylnmc 你错过了重点。 n 是一个占位符,只要它是一个正整数,它就可以是你想要的任何东西。而已。没有什么大不了的。
  • 一开始我没有意识到它是一个 int。我很着急,因为我有一个项目到期。对不起;然而,我的评论有点粗鲁。我有点累,但没有借口。我对我的程序感到非常沮丧,并且绝不会伤害到我。我不知道 n 是否可能不是 int。
  • @dylnmc 这就是我包含文档链接的原因,这样您就可以减轻任何额外的混乱。特别是,这里是get 的文档和streamsize 的文档。已接受道歉。
  • 对不起!我想我在一个学校项目上工作了 3 天(当时我的队友丢球了)。感谢您的理解。
【解决方案2】:
#include <iostream>
#include <string>

int main()
{
   std::string a;
   std::getline(std::cin,a);
   for(std::string::size_type i = 0; i < a.size(); ++i)
   {
       if(a[i] == ' ')
          std::cout<<"It is a space!!!"<<std::endl;
   }
   return 0;
}

【讨论】:

  • 我想使用 char,而不是 std::string。我有兴趣用 char[] 做我想做的事。无论如何,谢谢。
  • 您仍然可以通过 c_str() 函数或通过此答案中显示的 [] 运算符获取字符。 string 还将为您提供一堆有用的功能:cplusplus.com/reference/string/string
  • @Narek:我希望你有充分的理由想要处理裸char 缓冲区,我希望你对它们的了解比对 iostream 的了解更多。
  • @Narek:那么 rcollyer 的答案就是您需要阅读单个字符。它得到了我的投票。
【解决方案3】:

要输入包含大量空格的整行,您可以使用getline(cin,string_variable);

例如:

string input;
getline(cin, input);

这种格式会捕获句子中的所有空格,直到按下return

【讨论】:

    【解决方案4】:

    使用cin.get() 读取下一个字符。

    但是,对于这个问题,一次读取一个字符是非常低效的。请改用istream::read()

    int main()
    {
       char a[10];
       cin.read(a, sizeof(a));
       for(int i = 0; i < 10; i++)
       {
           if(a[i] == ' ')
              cout<<"It is a space!!!"<<<endl;
       }
       return 0;
    }
    

    并使用== 来检查相等性,而不是=

    【讨论】:

      【解决方案5】:

      使用 cin 的 >> 运算符将删除前导空格并在第一个尾随空格处停止输入。要获取包括空格在内的整行输入,请尝试cin.getline()。要一次抓取一个字符,您可以使用cin.get()

      【讨论】:

      • 请注意,std::istream::getline() 处理字符缓冲区,因此存在缓冲区溢出的风险。更好地使用来自&lt;string&gt;std::getline(std::istream&amp;,std::string&amp;,char c=' ')
      • @sbi: 最后一个参数不应该是char c = '\n'吗?
      • >> 运算符将删除前导空格以使用空格作为分隔符读取目标对象(因此对于标准 POD 将在第一个空格处停止读取目标)。 (所以它不会在第一个空白处“终止”)。另请注意,在使用“终止”一词时要非常小心,它在谈论 C++ 时具有非常明确的含义
      • @tiftik:确实。很抱歉我搞砸了。
      【解决方案6】:

      我想我会分享对我有用的答案。上一行以换行符结尾,因此这些答案中的大多数本身都不起作用。这样做了:

      string title;
      do {
        getline(cin, title);
      } while (title.length() < 2);
      

      这是假设输入总是至少 2 个字符长,这适用于我的情况。您也可以尝试简单地将其与字符串 "\n" 进行比较。

      【讨论】:

        【解决方案7】:

        尝试这四种方式来输入空格:)

        #include<iostream>
        #include<stdio.h>
        
        using namespace std;
        
        void dinput(char *a)
        {
            for(int i=0;; i++)
            {
                cin >> noskipws >> a[i];
                if(a[i]=='\n')
                {
                    a[i]='\0';
                    break;
                }
            }
        }
        
        
        void input(char *a)
        {
            //cout<<"\nInput string: ";
        
            for(int i=0;; i++)
            {
                *(a+i*sizeof(char))=getchar();
        
                if(*(a+i*sizeof(char))=='\n')
                {
                    *(a+i*sizeof(char))='\0';
                    break;
                }
        
            }
        }
        
        
        
        int main()
        {
            char a[20];
        
            cout<<"\n1st method\n";
            input(a);
            cout<<a;
        
            cout<<"\n2nd method\n";
            cin.get(a,10);
            cout<<a;
        
            cout<<"\n3rd method\n";
            cin.sync();
            cin.getline(a,sizeof(a));
            cout<<a;
        
            cout<<"\n4th method\n";
            dinput(a);
            cout<<a;
        
            return 0;
        }
        

        【讨论】:

          【解决方案8】:

          我也有同样的问题,我只是用了cin.getline(input,300);

          noskipwscin.get() 有时并不好用。由于您的数组大小合适,请尝试使用不关心任何字符的cin.getline(),并以指定的字符数读取整行。

          【讨论】:

            猜你喜欢
            • 2015-07-25
            • 1970-01-01
            • 1970-01-01
            • 2010-12-06
            • 2012-05-05
            • 1970-01-01
            • 2019-11-28
            • 1970-01-01
            • 2018-11-20
            相关资源
            最近更新 更多