#include <bits/stdc++.h>
using namespace std;
vector<string> split(string str, char delimiter)
{
vector<string> internal;
stringstream ss(str);
string tok;
while(getline(ss, tok, delimiter))
{
internal.push_back(tok);
}
return internal;
}
int main()
{
freopen("in", "r", stdin);
freopen("out", "w", stdout);
int tt;
scanf("%d", &tt);
for (int qq = 1; qq <= tt; qq++) {
printf("Case #%d: ", qq);
char s[1234];
stringstream ss;
gets(s);
for(int j = 0; s[j] ; j++) ss << s[j];
vector<string> w = split(ss.str(), ' ');
for(int i = 0; i < w.size(); ++i)
{
printf("%s ", w[i].c_str());
}
printf("\n");
}
return 0;
}
输入
5
this is a test
foobar
all your base
class
pony along
输出
Case #1:
Case #2: this is a test
Case #3: foobar
Case #4: all your base
Case #5: class
我是C ++初学者。我试图解决反向词问题:https://code.google.com/codejam/contest/351101/dashboard#s=p1
我无法弄清楚为什么我的输出会给出这个。
请帮助我。
答案 0 :(得分:1)
gets()
不是C ++库函数。这是一个C函数。同上freopen
()和scanf
()。
混合C库stdio
函数和C ++输入/输出库函数会导致未指定的行为。
将所有代码转换为仅使用std::cin
,std::cout
,std::getline()
和其他C ++输入/输出库函数。
答案 1 :(得分:0)
您的scanf
吃掉了5
,而不是下面的换行符,因此您最终会将剩余的广告作为第一次getline
来电(自{{1被吃掉了,是一条空行。)
在5
格式字符串中的格式代码之后添加一个空格,以便之后使用空格,或者为了安全,通过执行scanf
读取数字然后用{getline
解析它1}}或更好,使用基于fscanf
的解析方法来最小化stringstream
和cstdio
功能的混合。