以下代码适用于前两个getline,输入CC变量后,它会进入无限循环,跳过getlines而不是等待输入。
以下是一个示例运行:
输入持卡人姓名(或退出):John Doe
输入CC编号:1234 1234 1234 1555
//代码输出其他couts但不等待getline的输入。并重申cout声明。 cin.ignore似乎没有帮助或cin.clear()
代码:
int main(int argc, char* argv[]) {
char CCName[64]; //cardholder name
char CCNumber[16]; //credit card number
char Expiration[8]; //expiration date
float Amount;
while (true) {
/* input processing block */
//gather card holder name
cout << "\nEnter card holder name (or quit): ";
cin.getline(CCName, 64);
//quit command processing
if (strcmp(CCName, "quit") == 1) {
cout << "\nYou successfully terminated the program\n";
//~ close(sockfd); //close socket
exit(EXIT_SUCCESS);
}
//gather credit card number
cout << "\nEnter CC number: ";
cin.getline(CCNumber, 16);
//error checking
if (strlen(CCNumber) != 15 && strlen(CCNumber) != 16) {
cout << "\nCredit card number must be 15 to 16 digits, try again: ";
cin.getline(CCNumber,16);
}
//gather expiration date
cout << "\nEnter expiration: ";
cin.ignore();
cin.getline(Expiration, 7);
//error checking
if (strlen(Expiration) != 7) {
cout << "\nExpiration date format mm/yyyy. Try again: ";
cin.getline(Expiration, 7);
}
//gather amount
cout << "\nEnter amount: ";
cin >> Amount;
}
return 0;
}
答案 0 :(得分:0)
使用cin.getline()非常危险。 cin.getline()从键盘读取输入,然后当它读取换行符时(用户按下回车键时生成),它用空字符替换换行符。看看这会导致错误? 更重要的是,你需要担心输入的大小,这只会带来太多的限制,使其不那么用户友好。我建议改用getline(cin,stringName)。
答案 1 :(得分:0)
我对代码有一些建议, 1.增加char数组的大小
char CCName[65]; //cardholder name
char CCNumber[17]; //credit card number
2。纠正if条件
if (strcmp(CCName, "quit") == 0) {
3。改变这个
if (strlen(CCNumber) != 15 && strlen(CCNumber) != 16) {
由此
while (strlen(CCNumber) != 15 && strlen(CCNumber) != 16) {
4。关于日期输入,您可以编写一个单独的函数来检查其有效性。
答案 2 :(得分:0)
你的问题是你给它的字符多于CCNumber可以容纳的字符
当你做
时1234 1234 1234 1555
作为你的输入它实际上是19个字符(空格数)而不是16这会在cin中留下额外的字符,这会导致奇怪的行为。我把它修改为
cout << "\nEnter CC number: ";
cin.ignore();
cin.getline(CCNumber, 16);
带输入
1234123412341234
那部分有效。如果你想要空格增加数组的大小。 另外正如已经指出的那样,这不是很安全,因为您假设用户将为您提供完美的数据。一个非常危险的假设。