在 C++ 中,gets() 跳过一行
In C++, gets() skips a line
#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
我不明白为什么我的输出会这样。
请帮帮我。
gets()
不是 C++ 库函数。这是一个 C 函数。 freopen
() 和 scanf
().
同上
混合使用 C 库 stdio
函数和 C++ Input/Output 库函数会导致未指定的行为。
将所有代码转换为仅使用 std::cin
、std::cout
、std::getline()
和其他 C++ Input/Output 库函数。
你的 scanf
吃掉 5
,但不吃掉后面的换行符,所以你最终会在第一次 getline
调用时消耗该行的剩余部分(因为 5
被吃掉了,是一个空行)。
在 scanf
格式字符串中的格式代码后添加一个 space 以使其在之后消耗白色 space ,或者为了安全起见,通过执行 getline
然后用 fscanf
或更好的解析它,使用基于 stringstream
的解析方法来最小化 cstdio
和 iostream
功能的混合。
#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
我不明白为什么我的输出会这样。
请帮帮我。
gets()
不是 C++ 库函数。这是一个 C 函数。 freopen
() 和 scanf
().
混合使用 C 库 stdio
函数和 C++ Input/Output 库函数会导致未指定的行为。
将所有代码转换为仅使用 std::cin
、std::cout
、std::getline()
和其他 C++ Input/Output 库函数。
你的 scanf
吃掉 5
,但不吃掉后面的换行符,所以你最终会在第一次 getline
调用时消耗该行的剩余部分(因为 5
被吃掉了,是一个空行)。
在 scanf
格式字符串中的格式代码后添加一个 space 以使其在之后消耗白色 space ,或者为了安全起见,通过执行 getline
然后用 fscanf
或更好的解析它,使用基于 stringstream
的解析方法来最小化 cstdio
和 iostream
功能的混合。