C++ - 在没有 getline 的情况下读取一行
C++ - Reading a line without getline
我正在尝试从流中读取用户输入的数据,然后将其存储在自定义字符串中 class。
据我所知,std::getline() 只能将数据路由到 std::string ,这就是为什么我需要提出其他建议,因为 我的项目不是允许使用 std::string class.
我的代码如下所示:
String street();
std::cout << "Street: "; std::cin >> std::noskipws;
char c='[=10=]';
while(c!='\n'){
std::cin >> c;
street=street+c;
}std::cin >> std::skipws;
int bal=0;
std::cout << "Balance: "; std::cin >> bal;
您可以使用 C 函数“getchar()”从标准输入中读取单个字符。这个link描述的是:https://www.ibm.com/docs/en/i/7.3?topic=functions-getc-getchar-read-character.
这是我的代码:
String street=();
std::cout << "Street: ";
char c='[=10=]';
while(c!='\n'){
c = getchar();
street=street+c;
}
int bal=0;
std::cout << "Balance: "; std::cin >> bal;
cout << street << endl;
希望这对您有所帮助,我建议您制作一个独立函数,该函数将从标准输入读取行,其 return 类型为“String”。您可以将其声明为:
String readLine();
而且我还建议您注意 while 循环,因为从该循环中获得的字符串将在其末尾包含字符 '\n'。
To my best knowledge, std::getline() can route data only to std::string , that is why I need to come up with something else, as my project is not allowed to use std::string class.
请注意,std::getline
and std::istream::getline
是两个独立的函数。前者将使用 std::string
而后者将使用 C-style 字符串(即以空字符结尾的字符序列)。
因此,如果您不允许使用std::string
,那么您仍然可以使用std::istream::getline
,例如:
char line[200];
String street;
std::cout << "Street: ";
if ( std::cin.getline( line, sizeof line ) )
{
//the array "line" now contains the input, and can be assigned
//to the custom String class
street = line;
}
else
{
//handle the error
}
此代码假定您的自定义 class String
已为 C-style 字符串定义了 copy assignment operator。
如果行可能会大于固定数量的字符并且你想支持这样的行,那么你也可以在循环中调用std::istream::getline
:
char line[200];
String street;
std::cout << "Street: ";
for (;;)
{
std::cin.getline( line, sizeof line );
street += line;
if ( std::cin.bad() )
{
//TODO: handle error
}
if ( !std::cin.fail() || std::cin.eof() )
break;
std::cin.clear();
}
此代码假定 operator +=
是为 class String
定义的。
这个循环将永远持续到
getline
成功(即它能够提取(但不存储)换行符),或者
达到end-of-file(已设置eofbit
),或
发生错误(已设置badbit
)。
我正在尝试从流中读取用户输入的数据,然后将其存储在自定义字符串中 class。
据我所知,std::getline() 只能将数据路由到 std::string ,这就是为什么我需要提出其他建议,因为 我的项目不是允许使用 std::string class.
我的代码如下所示:
String street();
std::cout << "Street: "; std::cin >> std::noskipws;
char c='[=10=]';
while(c!='\n'){
std::cin >> c;
street=street+c;
}std::cin >> std::skipws;
int bal=0;
std::cout << "Balance: "; std::cin >> bal;
您可以使用 C 函数“getchar()”从标准输入中读取单个字符。这个link描述的是:https://www.ibm.com/docs/en/i/7.3?topic=functions-getc-getchar-read-character.
这是我的代码:
String street=();
std::cout << "Street: ";
char c='[=10=]';
while(c!='\n'){
c = getchar();
street=street+c;
}
int bal=0;
std::cout << "Balance: "; std::cin >> bal;
cout << street << endl;
希望这对您有所帮助,我建议您制作一个独立函数,该函数将从标准输入读取行,其 return 类型为“String”。您可以将其声明为:
String readLine();
而且我还建议您注意 while 循环,因为从该循环中获得的字符串将在其末尾包含字符 '\n'。
To my best knowledge, std::getline() can route data only to std::string , that is why I need to come up with something else, as my project is not allowed to use std::string class.
请注意,std::getline
and std::istream::getline
是两个独立的函数。前者将使用 std::string
而后者将使用 C-style 字符串(即以空字符结尾的字符序列)。
因此,如果您不允许使用std::string
,那么您仍然可以使用std::istream::getline
,例如:
char line[200];
String street;
std::cout << "Street: ";
if ( std::cin.getline( line, sizeof line ) )
{
//the array "line" now contains the input, and can be assigned
//to the custom String class
street = line;
}
else
{
//handle the error
}
此代码假定您的自定义 class String
已为 C-style 字符串定义了 copy assignment operator。
如果行可能会大于固定数量的字符并且你想支持这样的行,那么你也可以在循环中调用std::istream::getline
:
char line[200];
String street;
std::cout << "Street: ";
for (;;)
{
std::cin.getline( line, sizeof line );
street += line;
if ( std::cin.bad() )
{
//TODO: handle error
}
if ( !std::cin.fail() || std::cin.eof() )
break;
std::cin.clear();
}
此代码假定 operator +=
是为 class String
定义的。
这个循环将永远持续到
getline
成功(即它能够提取(但不存储)换行符),或者
达到end-of-file(已设置
eofbit
),或发生错误(已设置
badbit
)。