[英]C++: Will Not Accept New C-String Input
首先,提前感谢您的帮助。 这个问题让我抓狂。
我有一个接受 C 字符串的程序,然后可以计算元音和辅音的数量。 这没有问题。 但是,我还需要包含一个 function,它允许用户创建一个新字符串。 但问题是,当用户从菜单中选择“新字符串”时,它只是循环执行newString()
方法,而不等待用户输入。 然后它会创建一个新的空白屏幕。
这是整个程序。 newString()
方法在最后。
#include <iostream>
using namespace std;
// function prototype
void printmenu(void);
int vowelCount(char *);
int consCount(char *);
int cons_and_vowelCount(char *);
void newString(char *, const int);
int main() {
const int LENGTH = 101;
char input_string[LENGTH]; //user defined string
char choice; //user menu choice
bool not_done = true; //loop control flag
// create the input_string object
cout << "Enter a string of no more than " << LENGTH-1 << " characters:\n";
cin.getline(input_string, LENGTH);
do {
printmenu();
cin >> choice;
switch(choice)
{
case 'a':
case 'A':
vowelCount(input_string);
break;
case 'b':
case 'B':
consCount(input_string);
break;
case 'c':
case 'C':
cons_and_vowelCount(input_string);
break;
case 'd':
case 'D':
newString(input_string, LENGTH);
break;
case 'e':
case 'E':
exit(0);
default:
cout << endl << "Error: '" << choice << "' is an invalid selection" << endl;
break;
} //close switch
} //close do
while (not_done);
return 0;
} // close main
/* Function printmenu()
* Input:
* none
* Process:
* Prints the menu of query choices
* Output:
* Prints the menu of query choices
*/
void printmenu(void)
{
cout << endl << endl;
cout << "A) Count the number of vowels in the string" << endl;
cout << "B) Count the number of consonants in the string" << endl;
cout << "C) Count both the vowels and consonants in the string" << endl;
cout << "D) Enter another string" << endl;
cout << "E) Exit the program" << endl;
cout << endl << "Enter your selection: ";
return;
}
int vowelCount(char *str) {
char vowels[11] = "aeiouAEIOU";
int vowel_count = 0;
for (int i = 0; i < strlen(str); i++) {
for (int j = 0; j < strlen(vowels); j++) {
if (str[i] == vowels[j]) {
vowel_count++;
}
}
}
cout << "String contains " << vowel_count << " vowels" << endl;
return vowel_count;
} // close vowelCount
int consCount(char *str) {
char cons[43] = "bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ";
int cons_count = 0;
for (int i = 0; i < strlen(str); i ++) {
for (int j = 0; j < strlen(cons); j++) {
if (str[i] == cons[j]) {
cons_count++;
}
}
}
cout << "String contains " << cons_count << " consonants" << endl;
return cons_count;
} // close consCount
int cons_and_vowelCount(char *str) {
int cons = consCount(str);
int vowels = vowelCount(str);
int total = cons + vowels;
cout << "The string contains a total of " << total << " vowels and "
"consonants" << endl;
return total;
}
void newString(char *str, int len) {
cout << "Enter a string of no more than " << len-1 << " characters:\n";
cin.getline(str, len);
return;
}
语句cin >> choice
只消耗他们键入的字符,而不是后面的回车符。 因此,随后的getline()
调用读取一个空行。 一个简单的解决方案是调用getline()
而不是cin >> choice
,然后使用第一个字符作为选择。
顺便说一句, while (not done)
应该紧跟在do { … }
之后,而return 0
是多余的。 此外,您应该在程序开始时调用 newString 而不是重复其内容。
cin >> choice
在输入 stream.. 中留下换行符,这会导致下一个getline()
使用它并返回。 有很多方法.. 一种方法是在cin >> choice
之后立即使用cin.ignore()
。
cin >> choice
仅消耗 stream 中的一个字符(如前所述)。 你应该添加
cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
在cin>>choice
之后,忽略读取选项后进入 stream 的所有字符。
ps #include <limits>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.