我试图在C ++中使用Stack来反转字符串中包含的单词的顺序,但是我在最终输出中的字符串开头有空格。
请帮我找出错误并解决。
这是我的代码:
$db->value('ooactive', 'string')
输入:
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main()
{
int number;
cin >> number; // number of strings to reverse
for(int i = 0; i <= number; i++)
{
string str;
getline(cin, str); // input
std::stack<std::string> s; //stack
string str1 = "";
for(int i = 0; i <= str.length(); i++)
{
if(str[i] == ' ' || str[i] == '\0')
{ // add the word whenever it encounters a space
s.push(str1); //push the string
str1 = "";
}
else
str1 += str[i];
}
while(!s.empty())
{ // output
cout << s.top(); // simple displaying without space
cout << " ";
s.pop();
}
}
cout << '\n';
}
输出:
2
Reverse this String
OOP and DS
预期产出:
String this Reverse
DS and OOP
答案 0 :(得分:1)
您已接近解决方案,但您遇到了一种不直观的行为。您的问题是,当您cin
数字时,您在结尾处按下的回车键也会被以下getline
占用,从而导致空字符串。所以getline
总共给你3个字符串,这显然不是你想要的:你想要2,第一个是“反转这个字符串”,第二个是“OOP和DS”,仅此而已。你所做的就是使用3,因为开头有一个“幽灵”。你使用i
循环的“奇怪”退出条件(通常使用i<number
,但你使用了i<=number
),这让我觉得你必须注意到你经历了2次迭代正在跳过“OOP和DS”,你试图解决问题,但是你找到了一种解决方法而不是应用正确的解决方案。
正如其他人所说,您可以添加cin.ignore(10000,'\n');
来解决问题。这样,getline
将捕获适量的行(即2)。然后你必须恢复正确的退出条件,即
for(int i = 0; i < number; i++)
另一个循环看起来也很可疑:
for(int i = 0; i <= str.length(); i++)
在这里你做了同样的事情(你使用<=
而不是<
)但事实证明它没问题,因为你正在读取字符串结尾后的一个字符,这将给你终止你正在检查的字符'\ 0',所以没关系。
除此之外,我刚刚在打印完每条恢复的行之后移动了for {循环中的cout << endl;
。哦,我已经将内循环的变量从i
更改为j
:最好避免重用相同的名称(外部循环已使用i
),因为它们可能会令人困惑(尽管在这种情况下它们运作良好)。
这是最终的结果(我添加了几个cout
用于调试,我离开了,虽然已注释):
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main()
{
int number;
cin >> number; // number of strings to reverse
cin.ignore(10000,'\n');
for(int i = 0; i < number; i++)
{
string str;
getline(cin, str); // input
//cout << "Debug: i = " << i << ", string = " << str << endl;
std::stack<std::string> s; //stack
string str1 = "";
for(int j = 0; j <= str.length(); j++)
{
if(str[j] == ' ' || str[j] == '\0')
{ // add the word whenever it encounters a space
//cout << "Pushing '" << str1 << "'" << endl;
s.push(str1); //push the string
str1 = "";
}
else
str1 += str[j];
}
while(!s.empty())
{ // output
cout << s.top(); // simple displaying without space
cout << " ";
s.pop();
}
cout << endl;
}
}