[英]How should the cin.ignore() function be used in this code?
我的目标是解决这个问题:
给定一个长度为 N 且索引从 0 到 N-1 的字符串 S,将其偶数索引和奇数索引字符打印为单行上的 2 个空格分隔的字符串
int main() {
int test;
cin>>test;
for(int j = 0; j < test; j++){
char str[10000];
cin.ignore();
cin.getline(str,9999);
for( int i = 0; i < strlen(str); i++)
{
if(i % 2 == 0)
cout<<str[i];
}
cout <<" ";
for(int i = 0; i < strlen(str); i++)
{
if((i % 2 != 0))
cout<<str[i];
}
cout << endl;
}
return 0;
}
上面的代码给了我 output 为:
Hce akr ak n
对于给定的输入:
2 Hacker Rank
但是当我使用cin>>str
而不是cin.ignore()
和cin.getline()
时,我得到了正确的预期 output:这如何改变结果?
Hce akr Rn ak
你应该写cin.ignore(); 在for 循环之前。 您的代码在没有第一次迭代的情况下忽略了每个字符串的第一个字符。 您需要忽略换行符,只测试不是每个字符串。
看下面的代码:
int main() {
int test;
cin>>test;
cin.ignore();
for(int j = 0; j < test; j++){
char str[10000];
cin.getline(str,9999);
//cin>>str;
for( int i = 0; i < strlen(str); i++)
{
if(i % 2 == 0)
cout<<str[i];
}
cout <<" ";
for(int i = 0; i < strlen(str); i++)
{
if((i % 2 != 0))
cout<<str[i];
}
cout << endl;
}
return 0;
}
输入:
5
黑客
秩
哇
查看
最后一个
output:
赫切阿克尔
核糖核酸
万维网
cek hc
lsoe atn
使用ignore()
+ getline()
:
在第一次循环迭代中, cin.ignore()
跳过cin>>test
留下的换行符,然后cin.getline()
读取整行( Hacker
) ,包括但吞下换行符。
在第二次循环迭代中, cin.ignore()
跳过下一行的第一个字符 ( R
),然后cin.getline()
读取同一行 ( ank
) 的剩余字符,包括但吞下换行符。
解决方案是将调用cin.ignore()
移到循环上方:
cin>>test;
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // <-- move here
for(int j = 0; j < test; j++){
char str[10000];
cin.getline(str,9999);
...
}
使用operator>>
:
在第一次循环迭代中, cin>>str
跳过cin>>test
留下的换行符,然后读取下一个可用单词( Hacker
)。
在第二次循环迭代中, cin>>str
跳过前一个cin>>str
留下的换行符,然后读取下一个可用单词( Rank
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.