2017-01-16 6 views
1

В начале я могу использовать cin.getline (input2, 40), чтобы назначить строку для ввода2. Я делаю это так, чтобы у меня было две строки c с информацией в них.C++ В то время как в операторе switch cin.getline не присваивает переменной c string

Позже я вхожу в переключатель, где люди могут писать одну из строк строки c. Когда он выполняет cin.getline (input2, 40); как опция, все, что он делает, это удалить информацию в этой строке.

Я попытался удалить назначение cstring в начале, позволяя его изменять в коммутаторе, но он не назначен, а просто возвращается к оператору 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; 
      } 
+0

'назад [40]' находится за пределами для 'char назад [40]'. – crashmstr

+0

[Старичка, но лакомство] (http://stackoverflow.com/q/5739937/1460794). – wally

+0

Хех, да, я прекратил использовать эту функцию и вместо этого использовал функцию сортировки, я думаю. Эта функция есть наследие, и я не мог понять, как это работает, и именно поэтому я переключился с этого. Хороший улов, хотя я не мог понять это. – Greg

ответ

1

, что проблема с входным буфером так что 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 = '\0'; // for example 
cin >> in; // then evaluate 

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

Замечательно, спасибо. cin.ignore (1, '\ n'); сделал трюк. Я также установил определенное значение 'in', и это, похоже, теперь работает. – Greg

2

Для вашего состояния выхода, давайте просто показать часть таблицы истинности:

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 

Вот почему цикл продолжает работать для всех возможных входов. Вероятно, вы должны прочитать о теореме ДеМоргана и подумать о том, как это применимо здесь.

+0

Я уже усердно задал его (в! = 'X'), но это, похоже, не сработало. Я попробовал как с кепкой, так и с нижним регистром, но с этим ничего не добился. Приятно видеть, что у меня была логическая ошибка, когда я пытался сделать что-то другое, чтобы я мог сузить это. – Greg