2016-11-25 3 views
0

Я знаю, что мой метод может быть немного неудобным, я пытаюсь проверить ввод для меню, чтобы ТОЛЬКО вводилось число между 1-6 и ничего не принималось. У меня есть рабочий код, где я беру ввод в виде строки, а затем меняю его на int, чтобы использовать его в случае коммутатора, но я знаю, что могу сделать его более эффективным. Есть идеи?Манипулирование строкой в ​​1 символ

void menu(double pi, char ssTwo)               //menu for choosing a shape 
{ 
    string choice; 

    cout << "Welcome to the shape calculator!\n\nPlease select what you wish to calculate:\n\n1 - Area of a Circle\n\n2 - Circumference of a Circle\n\n3 - Area of a Rectangle\n\n4 - Area of a Triangle\n\n5 - Volume of a Cuboid\n\n6 - Exit the program\n\n "; 
    cin >> choice; 

    while (choice != "1" && choice != "2" && choice != "3" && choice != "4" && choice != "5" && choice != "6") 
    { 
     cout << "Invalid input, please enter a number of 1-6\n\n"; 
     cin >> choice; 

     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
    } 

    int choiceInt = atoi(choice.c_str()); 
    system("CLS"); 

    switch (choiceInt)               //switch case for each shape 
    { 
    case 1: 
     circleArea(pi, ssTwo); 
     break; 
    case 2: 
     circleCircum(pi, ssTwo); 
     break; 
    case 3: 
     rectanArea(ssTwo); 
     break; 
    case 4: 
     triangArea(ssTwo); 
     break; 
    case 5: 
     cubVol(); 
     break; 
    case 6: 
     exitSystem(); 
     break; 

    default: 
     cout << "Invalid input, please enter a number of 1-5\n\n"; 
     menu(pi, ssTwo); 
     break; 
    } 
} 
+0

Использовать значения ASCII; вы можете проверить char '1' против 49. Так что просто угрожайте char как числовое значение –

+1

Что не так с использованием 'case '1''? – stark

+0

@stark Я просто думаю, что заявление while слишком длинное, я думаю, что есть способ сделать его более эффективным. Это может быть просто смешно, но это работает, поэтому я, вероятно, оставлю это как есть. – PinkieBarto

ответ

0

Рассматривайте символ как значение Ascii; Проверить http://rextester.com/XKMJ90988

#define ONE 49 
#define TWO 50 
int main() 
{ 
    char val = '1'; 

    switch (val) 
    { 
     case ONE: 
     { 
      std::cout << "1 was Selected"; 
      break; 
     } 
     case TWO : 
     { 
      std::cout << "2 was Selected"; 
      break; 
     } 

     default: 
      std::cout << "Invalid input, please enter a number of 1-5\n\n"; 
      break; 
    } 
} 

Update # 1

Проверил: http://rextester.com/WWUM1166

Если прочитать значение из CIN в символьном, так и не струнной будет принимать только первый символ; Поэтому, если пользователь нажимает «1asdfad», у вас будет только 1 в символе, и вы будете работать с 1; если нажать «asdfasdf», он будет читать «a» и отображается недопустимый ввод;

int main() 
{ 
    char val; 

    std::cout << "Enter a number: "; 
    std::cin >> val; 

    std::cout << val << "\n"; 

    switch (val) 
    { 
     case '1': 
     { 
      std::cout << "1 was Selected"; 
      break; 
     } 
     case '2': 
     { 
      std::cout << "2 was Selected"; 
      break; 
     } 

     default: 
      std::cout << "Invalid input, please enter a number of 1-5\n\n"; 
      break; 
    } 
} 
+0

Это подходящий способ, проблема заключается в том, что я ввожу строку, в которой первая вещь - это номер 1-6 (например, 4ogjdifojg или 1ngsdffjsdiojf), тогда она примет это, и я не хочу, чтобы она принималась, потому что пользователь мог совершили ошибку. – PinkieBarto

Смежные вопросы