在 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::cinstd::coutstd::getline() 和其他 C++ Input/Output 库函数。

你的 scanf 吃掉 5,但不吃掉后面的换行符,所以你最终会在第一次 getline 调用时消耗该行的剩余部分(因为 5被吃掉了,是一个空行)。

scanf 格式字符串中的格式代码后添加一个 space 以使其在之后消耗白色 space ,或者为了安全起见,通过执行 getline 然后用 fscanf 或更好的解析它,使用基于 stringstream 的解析方法来最小化 cstdioiostream 功能的混合。