【问题标题】:How should the cin.ignore() function be used in this code?在这段代码中应该如何使用 cin.ignore() 函数?
【发布时间】:2020-05-17 16:26:44
【问题描述】:

我的目标是解决这个问题:

给定一个长度为 N 且索引从 0 到 N-1 的字符串 S,将其偶数索引字符和奇数索引字符作为 2 个空格分隔的字符串打印在一行上

int main() {

    int test;
    cin>>test;
    for(int j = 0; j < test; j++){

        char str[10000];
        cin.ignore();
        cin.getline(str,9999);
        for( int i = 0; i < strlen(str); i++)
        {
            if(i % 2 == 0)
                cout<<str[i];
        }
        cout <<" ";
        for(int i = 0; i < strlen(str); i++)
        {
            if((i % 2 != 0))
                cout<<str[i];
        }

        cout << endl;
    }

    return 0;
}

上面的代码给我的输出是:

赫赛克 知道

对于给定的输入:

2 黑客 秩

但是当我使用cin&gt;&gt;str 而不是cin.ignore()cin.getline() 时,我得到了正确的预期输出:这对结果有何影响?

赫赛克 核糖核酸

【问题讨论】:

  • 请阅读更多关于getline 及其作用的信息。想想你如何将它与ignore 函数一起使用,以及它的作用。
  • 我的经验法则是ignore 在流中留下不需要的字符的操作之后。几乎每次您将忽略放在另一个操作之前,您都会后悔。
  • 我的经验法则是,如果你必须使用cin.ignore(),那么你在阅读cin 的方式非常糟糕。一般来说,如果您将cin &gt;&gt; &lt;whatever&gt;cin.getline() 混合使用,您会遇到问题,因为它们处理输入的某些方面(换行符、错误条件)不同,因此它们以不需要的方式交互。 cin.ignore() 可以掩盖这些错误,但是,如果您以混合方式阅读更多输入,那也会变得困难。尝试使用 getline()cin 读取 所有内容 - 并根据需要解析行 - 而不是一起使用 cin &gt;&gt; ...cin.getline()
  • 问题未明确。不清楚首先要从输入中读取字符串;任务可能只是提供一个获取字符串的函数并以指定的方式打印两个结果字符串。字符串 S(请注意,赋值不是说“单词”!)可以包含空格吗?如果没有,只需使用 operator>>(string) 从输入中读取单词。不需要getline,根本不需要忽略。如果是:我们需要一个结束标记。如果这是一个换行符,您只需使用 getline 读取,但在读取第一个数字后您需要一个忽略。
  • 顺便说一句:赞成(1)用合理的代码展示自己的重大努力,实际上是一个独立的最小示例。如果可以的话,我会给你三个赞成票。 (2) 说明预期结果; (3) 说明实际结果。瞧:你会得到有用的答案。

标签: c++ c++14 testcase


【解决方案1】:

您应该在 for 循环 之前编写 cin.ignore(); 。您的代码在没有第一次迭代的情况下忽略了每个字符串的第一个字符。您需要忽略换行符,只测试不是每个字符串。

见以下代码:

int main() {

    int test;
    cin>>test;
    cin.ignore();
    for(int j = 0; j < test; j++){

        char str[10000];
        cin.getline(str,9999);
        //cin>>str;

        for( int i = 0; i < strlen(str); i++)
        {
            if(i % 2 == 0)
                cout<<str[i];
        }
        cout <<" ";
        for(int i = 0; i < strlen(str); i++)
        {
            if((i % 2 != 0))
                cout<<str[i];
        }

        cout << endl;
    }

    return 0;
}

输入:
5
黑客
排名

检查
最后一个

输出:
Hce akr
Rn ak
万维网
cek hc
lsoe atn

【讨论】:

    【解决方案2】:

    使用ignore()+getline()

    在第一次循环迭代中,cin.ignore() 跳过 cin&gt;&gt;test 留下的换行符,然后 cin.getline() 读取整行 (Hacker) 包括但吞下换行符.

    在第二次循环迭代中,cin.ignore() 跳过下一行的第一个字符 (R),然后 cin.getline() 读取同一行的剩余字符 (ank),包括但吞下换行符.

    解决办法是将cin.ignore()的调用移到循环上方:

    cin>>test;
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // <-- move here
    
    for(int j = 0; j < test; j++){
        char str[10000];
        cin.getline(str,9999);
        ...
    }
    

    使用operator&gt;&gt;

    在第一次循环迭代中,cin&gt;&gt;str 跳过 cin&gt;&gt;test 留下的换行符,然后读取下一个可用单词 (Hacker)。

    在第二次循环迭代中,cin&gt;&gt;str 跳过前一个 cin&gt;&gt;str 留下的换行符,然后读取下一个可用单词 (Rank)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 2017-11-24
      相关资源
      最近更新 更多