getline的第一个数组是空的''?

问题描述 投票:0回答:2

我有这个简单的代码,我使用了 char,因为我们需要使用它,建议暂时不要使用字符串和数组。它不一样但它相似这段代码是我从哪里得到问题

int main() {
    char province[2];
    char postalcode[6];
  
//** ON,n6n7y7** this is  the input
//Province is = ON and then postal code = n6n7y7
// the ',' should be discarded or ignored. and has to be typed all in one line as input

    cin.getline(province, ',');
    cin.getline(postalcode, '\0');
  

    return 0;

}

邮政编码有 6 个章程,省份有 2 个。我需要一个缓冲区吗?它的分隔符已经被忽略了

为什么省方会把它当成ON然后打分隔符是a, 那么邮政编码没有。难道它不应该是获取行并将其放入邮政编码直到它碰到空字符串

c++ delimiter cin
2个回答
2
投票

您可以使用分隔符 ' ' 为邮政编码,表示输入后输入的换行符。这是您的代码的更新版本:

int main() {
    char province[3]; // make province array one character larger to allow for null terminator
    char postalcode[7]; // make postalcode array one character larger to allow for null terminator
  
    cout << "Enter province and postal code separated by a comma: ";
    cin.getline(province, 3, ','); // limit input to 2 characters for province
    cin.ignore(); // ignore the comma delimiter
    cin.getline(postalcode, 7, '\n'); // limit input to 6 characters for postal code

    cout << "Province: " << province << endl;
    cout << "Postal code: " << postalcode << endl;

    return 0;
}

0
投票

至少在我看来,

istream::getline
(与
std::getline
相反)让你很容易犯错误,不小心忘记传递长度,并把你想传递的作为分隔符,但将其用作最大读取长度(并使用默认的
'\n'
作为分隔符。

如果我必须使用它,我会在这个订单上写一个小包装函数:

template <typename T, std::size_t N>
std::istream &getline(std::istream &is, T (&array)[N], char delim = '\n') {
    return is.getline(array, N, delim);
}

这具有相同数量的参数,但它们的类型差异很大,如果您尝试传递一个代替另一个,则会出现错误。它自己推导出的长度(大多数人忘记的长度,就像你所做的那样)(尽管这有一个限制:它需要你传递一个实际的数组——而不是,例如,分配给

new
的内存块).

这里有一些演示代码:

#include <iostream>
#include <sstream>

template <typename T, std::size_t N>
std::istream &getline(std::istream &is, T (&array)[N], char delim = '\n') {
    return is.getline(array, N, delim);
}

int main() { 

    std::istringstream input{"ON,n6n7y7"};

    char province[3];
    char postal_code[7];

    getline(input, province, ',');
    getline(input, postal_code);

    std::cout << "province: " << province << ", code: " << postal_code << "\n";
}
© www.soinside.com 2019 - 2024. All rights reserved.