为什么我的字符串第二次没有正确输入输入?
我的代码需要一个字符串,并显示偶数索引位置字母,然后在一个空格后显示奇怪的索引字母。 就像我给一个输入Hacker
它应该给Hce akr
。 现在我的代码没有给我第二个输入的正确答案。 就像给第二个输入Rank
它应该给Rn ak
。 而不是它给出了一个k
。它错过了R
。为什么我的字符串第二次没有正确输入输入?
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
void f(string a) {
string odd,even;
for(int i=0; a[i] != '\0'; i++) {
if(i % 2 == 0) {
even = even + a[i];
} else {
odd = odd + a[i];
}
}
cout << even << " " << odd << "\n";//<<<<<<I THINK THIS \n IS THE
//PROBLEM BUT I NEED THIS \n.I OBESERVED THAT ON REMOVING \n, CODES
// WORKS CORRECTLY.
}
int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
string str;
int t;
cin >> t;
for(int i=0; i < t; i++) {
std::cin.ignore();
getline(cin, str);
f(str);
}
return 0;
}
你应该移动std::cin.ignore()
外循环。 getline消耗换行符,只是第一个输入离开它(cin>>t
)。
当你阅读例如int或char,输入后的换行符保留在输入流中。因此,现在做一个getline只会读取换行符,并且您调用cin.ignore()
来使用换行符。但是,每个getline()
消耗整行(包括换行符),因此您不必调用cin.ignore()
,如果这样做,它将默认消耗一个字符,这里是'R'。
cin.ignore()的默认值是仅忽略单个字符。就像你的新生产线一样。这是从循环的第二次迭代开始发生的。此外,如果你想忽略更长的字符串,你必须添加额外的参数,可能是cin.ignore(1000,'\ n'),它跳过多达1000个字符或下一个换行符(以二者为准)第一)。
希望这会有所帮助。
我试过,..still的情况是一样的。但是在它的循环之外移动std :: cin.ignore()。 –
它没有解决任何问题,只是通过强制刷新输出流来增加不需要的开销。 – StoryTeller
好的,我要编辑我的答案。谢谢@Story Teller –
使用'i!= a.size()'作为条件,'a [i]!='\ 0''有点可笑 –
[cin和getline跳过输入](http:/ /stackoverflow.com/questions/10553597/cin-and-getline-skipping-input),检查哪些忽略参数使用。 – stefaanv