C++ 在 switch 语句中,cin.getline 不分配给 c 字符串变量

C++ While in switch statement, cin.getline does not assign to c string variable

早期我可以使用 cin.getline(input2, 40) 为 input2 分配一条线。 我也这样做,所以我有两个包含信息的 c 字符串。

稍后我输入一个开关,人们可以在其中改写其中一个 c 字符串行。当它执行 cin.getline(input2, 40);作为选项,它所做的只是删除该字符串中的信息。

我已经尝试删除开头的 cstring 赋值,允许在 switch 中更改它,但它没有赋值,而是返回到 switch 语句。

我试过使用 cin.getline(input2, 40, '\n') 以便 cin 在继续之前等待换行,但它似乎会自动换行。

输入的开关选项是'i'。

过去一个小时左右我一直在努力解决这个问题,所以现在我谦虚地请求你的帮助。

奖金指向发现为什么当我输入 x 时,switch 语句没有结束的人。

            #include<iostream>
            #include<conio.h>
            #include<string>
            #include<algorithm>

            using namespace std;

            char rev (char *);
            bool compareChar (char *, char *);
            int getLength(char *);
            string concat1 (char *, char *);

            int main()
            {
                char input1[80];
                char input2[80];
                char *input1Ptr = input1;
                char *input2Ptr = input2;
                int length = 0;
                string concat = "None";

                cout << "Input a line of text for line 1: ";
                cin.getline(input1, 40);
                cout << "Input a line of text for line 2: ";
                cin.getline(input2, 40);

                char in;
                while (in != 'x' || in != 'X'){

                cout << endl;
                cout << endl;

                cout << "Enter i for Input" << endl;
                cout << "Enter r for Reverse" << endl;
                cout << "Enter c for compare" << endl;
                cout << "Enter o for concatenate" << endl;
                cout << "Current concatenate is " << concat << endl;
                cout << "String a" << endl;
                cout << "String b" << endl;
                cout << "Enter x to exit" << endl;

                cin >> in;

                switch (in) {
                    case 'i':
                    case 'I':
                        cout << endl;
                        cout << "Rewrite Line 2: " << endl;
                        cin.getline(input2, 40, '\n');
                        cout << input2;
                        break;

                    case 'r':
                    case 'R':
                        length = getLength(input1);
                        reverse(input1, input1 + length);
                        cout << input1;
                        break;

                    case 'c':
                    case 'C':
                        if (compareChar(input1Ptr, input2Ptr) == 1){
                            cout << "True" << endl;
                        }
                        else {
                            cout << "False" << endl;
                        }
                        break;

                    case 'o':
                    case 'O':
                        concat = concat1(input1, input2);
                        cout << concat;
                        break;

                    case 'a':
                    case 'A':
                        cout << input1;
                        break;

                    case 'b':
                    case 'B':
                        cout << input2;
                        break;

                    default:
                        cout << "Syntax Error";
                        in = 'x';
                        break;
                    }
                }
            }

            string concat1 (char *a, char *b){
                string con;
                con += a;
                con += b;

                return con;
            }

            char rev (char *a){
                int length1 = 0;
                int counter = 0;
                int incr = 0;
                char backward[40];

                while (*a) {
                    cout << *a << " " ;
                    length1++;
                    a++;
                }

                counter = length1;

                while (counter > 0){
                    backward[incr] = a[counter];
                    counter--;
                    incr++;
                }

                return backward[40];
            }

            bool compareChar (char *a, char *b){
                int counter = 0;
                bool comparing = false;

                while (counter < 40){
                    if (a[counter] == b[counter]){
                        counter++;
                        comparing = true;
                    }
                    else {
                        counter = 40;
                    }
                }

                return comparing;
            }

            int getLength(char *input1)
            {
                int length = 0;

                while (*input1){
                    input1++;
                    length++;
                }

                return length;
            }

这是输入缓冲区的问题,所以 endline character 仍然存在,所以如果用户输入 i 进行输入,那么他无法更正此问题,您必须清除输入缓冲区:

    case 'i':
    case 'I':
        cout << endl;
        cout << "Rewrite Line 2: " << endl;
        cin.ignore(1, '\n'); // add this
        cin.getline(input2, 40, '\n');
        cout << input2;
        break;

还有为什么要在初始化之前检查 in 的值:

char in;
while (in != 'x' || in != 'X'){

更正为:

char in = '[=12=]'; // for example
cin >> in; // then evaluate

while (in != 'x' || in != 'X'){

关于你的退出条件,让我们只展示部分真相table:

in     |   in != 'x'     |  in != 'X'     |  (in != x || in != 'X')
--------------------------------------------------------------------
'a'            T                T                      T
'A'            T                T                      T
'b'            T                T                      T
'x'          false              T                      T
'X'            T              false                    T
'7'            T                T                      T

这就是循环针对所有可能的输入继续 运行 的原因。您可能应该阅读 DeMorgan 定理并思考它如何应用在这里。