C++ 中的 Getline 函数将第一个输入作为空字符。它应该这样做吗?
Getline function in C++ is taking first input as the null character. Is it supposed to do that?
从第一行输出来看,它似乎将空字符作为第一个字符串。也正因为如此,它丢失了它应该作为输入的最后一个字符串。我可能错过了 getline 的使用,但我不确定,我们将不胜感激。
int main() {
short int t,i;
cin>>t;
string a;
while(t–)
{
getline(cin,a);
cout<<"length of string is "<<a.length()<<endl;
for(i=0;i<a.length()/2;i+=2)
{
cout<<a[i];
}
cout<<endl;
}
return 0;
}
输入
4个
你好
理解
思考
编程
输出
字符串长度为0
字符串的长度是 5
H
字符串长度为 10
UDR
字符串的长度是 5
吨
执行cin>>t;
后,缓冲区仍包含换行符序列。然后 getline()
立即读取一个换行符,这会欺骗它认为用户只是按下了回车键而没有输入任何内容。
为了解决这个问题,您需要在调用 getline()
之前忽略换行符。
当您调用 cin>>t
时,它会在到达非数字字符时停止读取,因此它会将换行符留在 cin
的缓冲区中。随后的 std::getline()
读取该换行符和 returns 一个空白字符串。
因此,您需要:
在调用 cin>>t
之后调用 cin.ignore()
以删除换行符:
#include <string>
#include <iostream>
#include <limits>
int main()
{
short int t;
std::cin >> t;
std::cin.ignore(std::numeric_limits<std::streamize>::max(), '\n'); // <-- add this!
while (t-– > 0)
{
std::string a;
std::getline(std::cin, a);
std::cout << "length of string is " << a.length() << std::endl;
for (std::string::size_type i = 0; i < (a.length() / 2); i += 2)
{
std::cout << a[i];
}
std::cout << std::endl;
}
return 0;
}
使用std::getline()
读取t
的行,然后使用std::istringstream
从该行解析t
的值:
#include <string>
#include <iostream>
#include <sstream>
int main()
{
short int t;
std::string a;
std::getline(std::cin, a);
std::istringstream(s) >> t;
while (t-– > 0)
{
std::getline(std::cin, a);
std::cout << "length of string is " << a.length() << std::endl;
for (std::string::size_type i = 0; i < (a.length() / 2); i += 2)
{
std::cout << a[i];
}
std::cout << std::endl;
}
return 0;
}
从第一行输出来看,它似乎将空字符作为第一个字符串。也正因为如此,它丢失了它应该作为输入的最后一个字符串。我可能错过了 getline 的使用,但我不确定,我们将不胜感激。
int main() {
short int t,i;
cin>>t;
string a;
while(t–)
{
getline(cin,a);
cout<<"length of string is "<<a.length()<<endl;
for(i=0;i<a.length()/2;i+=2)
{
cout<<a[i];
}
cout<<endl;
}
return 0;
}
输入
4个 你好 理解 思考 编程
输出
字符串长度为0 字符串的长度是 5 H 字符串长度为 10 UDR 字符串的长度是 5 吨
执行cin>>t;
后,缓冲区仍包含换行符序列。然后 getline()
立即读取一个换行符,这会欺骗它认为用户只是按下了回车键而没有输入任何内容。
为了解决这个问题,您需要在调用 getline()
之前忽略换行符。
当您调用 cin>>t
时,它会在到达非数字字符时停止读取,因此它会将换行符留在 cin
的缓冲区中。随后的 std::getline()
读取该换行符和 returns 一个空白字符串。
因此,您需要:
在调用
cin>>t
之后调用cin.ignore()
以删除换行符:#include <string> #include <iostream> #include <limits> int main() { short int t; std::cin >> t; std::cin.ignore(std::numeric_limits<std::streamize>::max(), '\n'); // <-- add this! while (t-– > 0) { std::string a; std::getline(std::cin, a); std::cout << "length of string is " << a.length() << std::endl; for (std::string::size_type i = 0; i < (a.length() / 2); i += 2) { std::cout << a[i]; } std::cout << std::endl; } return 0; }
使用
std::getline()
读取t
的行,然后使用std::istringstream
从该行解析t
的值:#include <string> #include <iostream> #include <sstream> int main() { short int t; std::string a; std::getline(std::cin, a); std::istringstream(s) >> t; while (t-– > 0) { std::getline(std::cin, a); std::cout << "length of string is " << a.length() << std::endl; for (std::string::size_type i = 0; i < (a.length() / 2); i += 2) { std::cout << a[i]; } std::cout << std::endl; } return 0; }