更有效的删除空格的方法

时间:2014-12-13 18:22:44

标签: c++ arrays char istream removing-whitespace

我正在尝试删除空格并将字符存储在空格之后。

这是我正在阅读的文件:

Map: Out of planet
Player:    Max

这是我的代码

istreams.get(characters, 50, ':');
istreams.get(c);
istreams.getline(kill.killMap, 35);
if(kill.killMap[0] = '\0)
{ 
   cout << "Error;
   break;
}
istreams >> ws;

istreams.get(characters, 50, ':');
istreams.get(c);
istreams.getline(kill.player, 35);
if(kill.player[0] = '\0)
{ 
   cout << "Error;
   break;
}

虽然ws函数从流中删除了空格,但我认为它与char数组不一样。如果有人能告诉我一种让ws工作的方法,或者只是一种有效的方法来删除空白,我会非常感激

这就是我得到的:

cout << kill.killMap << endl; 
  Out of planet  //THERE IS WHITESPACE
cout << kill.player << endl;   
      Max  //THERE IS WHITESPACE

我真正想要的是什么:

cout << kill.killMap << endl; 
Out of planet    // NOTICE THERE IS NO WHITESPACE
cout << kill.player << endl;   
Max             // NOTICE THERE IS NO WHITESPACE

有没有办法在不使用C++ stringsVectors的情况下执行此操作。我打算使用C Style strings

3 个答案:

答案 0 :(得分:1)

操纵器std::ws立即消耗任何前导空格。如果要为格式化输入启用/禁用自动跳过空格,请使用std::skipwsstd::noskipws。默认情况下,启用跳过空格。但它仅适用于[正确实现的]输入运算符(>>)。

要在无格式输入前跳过空格,请使用std::ws,例如:

(std::cin >> std::ws).get(c);

答案 1 :(得分:0)

首先不要使用字符数组。这可以使用std::string很好地清理。以下代码假定您已将成员变量从字符数组更改为标准字符串类:

istreams.ignore(std::numeric_limits<std::streamsize>::max(), ':');
if (!std::getline(istreams >> std::ws, kill.killMap) || kill.killMap.empty())
{
    std::cerr << "There has been an error\n";
    break;
}

istreams.ignore(std::numeric_limits<std::streamsize>::max(), ':');
if (!std::getline(istreams >> std::ws, kill.killMap) || kill.killMap.empty())
{
    std::cerr << "There has been an error\n";
    break;
}

Demo

以下是其他一些选择:

  1. 创建一个过滤流缓冲区,忽略:之前的第一个字符。
  2. 创建一个调用ignore()的流迭代器,就像我每次迭代一样。
  3. 使用regular expressions匹配每行的模式并提取为字符串。

答案 2 :(得分:0)

您可以像输入其他答案一样编写输入前输入空格的函数。

您还可以编写一个trim函数来修剪字符串开头和结尾的空格:

像这样:

string trim(const string& s)
{
  string res;
  size_t pos1,pos2;
  pos1 = s.find_first_not_of(" \t\r\n");
  pos2 = s.find_last_not_of(" \t\r\n");
  if(pos2!=string::npos)
      pos2++;
  res = s.substr(pos1,pos2-pos1);
  return res;
}

在使用流时,您只能删除前导空格,当您处理字符串时,您还可以删除拖尾空格。

请注意,在getcin>>之前,您必须吃流中的空白区域。