C++:不接受新的 C 字符串输入

C++: Will Not Accept New C-String Input

本文关键字:字符串 输入 不接受 C++      更新时间:2023-10-16

首先,提前感谢您的帮助。这个问题让我发疯。

我有一个接受c字符串的程序,然后可以计算元音和辅音的数量。这没有问题。但是,我还需要包含一个允许用户创建新字符串的函数。但是,问题是,当用户从菜单中选择"新字符串"时,它只是循环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输入

流中留下换行符,导致下一个getline()使用它并返回。有很多方法..一种方法是在cin >> choice后立即使用cin.ignore()

cin >> choice只使用流中的一个字符(如前所述)。您应该添加

    cin.ignore(std::numeric_limits<std::streamsize>::max(),'n');

cin>>choice后立即忽略阅读选择后进入流中的所有字符。

附言 #include <limits>