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 定义的。

这个循环将永远持续到

  1. getline 成功(即它能够提取(但不存储)换行符),或者

  2. 达到
  3. end-of-file(已设置eofbit),或

  4. 发生错误(已设置badbit)。