为什么代码首先打印0

时间:2014-06-04 05:20:55

标签: c++

#include <cstdio>
#include <string>
#include <set>
#include <sstream>
#include <iostream>

using namespace std;

int main()
{
  int t, z;
  scanf("%d", &t);

  while (t--) {
    string buf, str;
    getline(cin, str);
    stringstream ss(str);
    int cnt = 0;

    set<string> tokens;

    while (ss >> buf) {
        tokens.insert(buf);
    }

    for (set<string>::iterator it = tokens.begin(); it != tokens.end(); ++it) {
        cnt++;
    }

    printf("%d\n", cnt);
 }

 return 0;
}

此代码仅用于计算字符串中存在的不同单词的数量。例如输入

  

我是我

将提供输出

  

2

但是当我输入测试用例时,它首先给出0作为输出而忽略了最后一个测试用例..它的原因是什么?怎么能纠正? 这是link

3 个答案:

答案 0 :(得分:4)

你的scanf只读取整数 - 它没有读取行尾。所以你的第一个&#34;线&#34;是&#34; 4&#34;的其余部分。在上面。读取到行尾或使用user3477950中的解决方案。

答案 1 :(得分:3)

萨米尔,

修改你的代码:

    int main()
    {
        char eatNewline = '\0';
        int t, z;
        scanf("%d", &t);
        eatNewline=getchar();   //Eat the enter key press.


        while (t--)
        {
          string buf, str;
          getline(cin, str);
          stringstream ss(str);
          int cnt = 0;

          set<string> tokens;

          while (ss >> buf)
          {
            tokens.insert(buf);
          }

          for (set<string>::iterator it = tokens.begin(); it != tokens.end(); ++it)
          {
            cnt++;
          }

          printf("%d\n", cnt);
        }

 return 0;

}

[root@saas ~]# ./tst
4
now do it now
3
now     do it now
3
I am  good boy
4
am am
1

如果有帮助,请告诉我! :)

答案 2 :(得分:1)

因为在scanf("%d", &t)之后,尾部\n仍在输入字符串缓冲区中。

要解决此问题,您可以将其更改为:

scanf("%d ", &t); // add a space after %d to catch the '\n' character

或添加

cin >> ws;

或使用gets(...)等。