#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
答案 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(...)
等。