我正在尝试删除空格并将字符存储在空格之后。
这是我正在阅读的文件:
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++ strings
或Vectors
的情况下执行此操作。我打算使用C Style strings
答案 0 :(得分:1)
操纵器std::ws
立即消耗任何前导空格。如果要为格式化输入启用/禁用自动跳过空格,请使用std::skipws
或std::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;
}
以下是其他一些选择:
:
之前的第一个字符。ignore()
的流迭代器,就像我每次迭代一样。答案 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;
}
在使用流时,您只能删除前导空格,当您处理字符串时,您还可以删除拖尾空格。
请注意,在get
后cin>>
之前,您必须吃流中的空白区域。