这段代码中应该如何使用 cin.ignore() 函数?
How should the cin.ignore() function be used in this code?
我的目标是解决这个问题:
Given a string S, of length N that is indexed from 0 to N-1, print its even-indexed and odd-indexed characters as 2 space-separated strings on a single line
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;
}
以上代码给出的输出为:
Hce阿克尔
kn
对于给定的输入:
2个
黑客
秩
但是当我使用 cin>>str
而不是 cin.ignore()
和 cin.getline()
时,我得到了正确的预期输出:这如何改变结果?
Hce阿克尔
Rnak
使用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
)。
你应该在 for loop 之前写 cin.ignore(); 。您的代码在没有第一次迭代的情况下忽略每个字符串的第一个字符。您需要忽略换行符,而不是对每个字符串进行测试。
查看下面的代码:
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
黑客
排名
哇
检查
最后一个
输出:
Hce akr
rn ak
WO
cek hc
lsoe atn
我的目标是解决这个问题:
Given a string S, of length N that is indexed from 0 to N-1, print its even-indexed and odd-indexed characters as 2 space-separated strings on a single line
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;
}
以上代码给出的输出为:
Hce阿克尔 kn
对于给定的输入:
2个 黑客 秩
但是当我使用 cin>>str
而不是 cin.ignore()
和 cin.getline()
时,我得到了正确的预期输出:这如何改变结果?
Hce阿克尔 Rnak
使用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
)。
你应该在 for loop 之前写 cin.ignore(); 。您的代码在没有第一次迭代的情况下忽略每个字符串的第一个字符。您需要忽略换行符,而不是对每个字符串进行测试。
查看下面的代码:
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
黑客
排名
哇
检查
最后一个
输出:
Hce akr
rn ak
WO
cek hc
lsoe atn