2013-12-25 2 views
0

Что я пытаюсь сделать, это проверить, имеет ли строка, содержащая пользователь, прописную букву или нет. Первая часть кода с перечислимой константой, есть только для другого метода, , который я должен использовать, используя числа, назначенные словам Sunday = 7, Monday = 1, Tuesday = 2 и т. Д. Я пытаюсь пользователь не предлагает номера, но фактическое слово (воскресенье, понедельник, вторник), но я хочу, чтобы они указали день недели с большой буквы.Получение строки, проверка на письмо с капиталом

Проблема, которую я получаю: компилируется отлично, но все, что вы вводите, каким-то образом перенаправляется по пути выполнения, который всегда возвращает «Повторить с заглавной буквы». Это происходит, если я набираю fjdkalfda или воскресенье или воскресенье или что-то еще. Вот код. Извините, если он не в коде, первый пользователь Stack Overflow.

#include <iostream> 
#include <string> 
#include <cstring> 
using namespace std; 

int main(){ 
    /*enum DaysOfWeek { 
     Monday = 1, 
     Tuesday, 
     Wednesday, 
     Thursday, 
     Friday, 
     Saturday, 
     Sunday 
    };*/ //I'm not using this, but I can get my code to work with this 
      //enumerated constant by asking the user to input a number corresponding 
      //to the day of the week and then using if-else statements to check, say, 
      // int Day; 
      // cin >> Day 
      // then use if statements to check if Day = a certain number, to give output 

    cout << "Enter the day of week with a capital letter: "; 
    string Day; 
    getline(cin, Day); 
    if (Day == ("monday") || ("tuesday")) 
     cout << "Retype w/ a capital letter" << endl; 
    else if (Day == ("wednesday") || ("thursday")) 
     cout << "Retype w/ a capital letter" << endl; 
    else if (Day == ("friday") || ("saturday")) 
     cout << "Retype w/ a capital letter" << endl; 
    else if (Day == ("sunday")) 
     cout << "Retype w/ a capital letter" << endl; 
    else 
    { 
     if (Day == "Monday") 
      cout << "Moon" << endl; 
     else if (Day == "Tuesday") 
      cout << "Mars" << endl; //continue with the days etc... 
    } 
    return 0; 
} 
+1

'если (День == (" Понедельник ") || (" tuesday "))' не делает то, что вы, кажется, думаете, что это так. –

+0

Спасибо за точку. Я просто воспринимаю строки с этим кодом, и если я разделю «понедельник» и «вторник» на отдельные строки, он будет работать, если я наберу «понедельник» или еще что-то еще. Благодарю. Я буду осторожен с логическим оператором ||, возможно, для просто чисел – DWade64

+1

Вы можете выполнить несколько тестов в одной строке, вам просто нужно использовать правильный синтаксис: 'if (Day ==" monday "|| Day = = "tuesday"). В вашем примере первое, если всегда верно. –

ответ

1

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

Я выхожу из вашего кода, что вас интересует только проверка того, что первая буква является заглавной. Это верно?

+0

Да, я просто пытаюсь перевести мой код на два пути. Один заставляет пользователя повторить день недели, если они скажут «понедельник», а другой - выход, если они набрали «понедельник». Но все, кажется, идет по пути повтора. Если я наберу «понедельник», им сказали перепечатать заглавную букву. – DWade64

+0

Ну, если ifs терпят неудачу, это говорит о том, что get_day не имеет ожидаемого значения. После преобразования напечатайте значение между двумя угловыми скобками, чтобы вы могли видеть, что такое фактическое значение. – EvilTeach

1

Существует функция ISUPPER в ctype.h, которая возвращает истину, если char в верхнем регистре:

#include <ctype.h> 

... 
isCapitalized = isupper(str[0]); 
... 
1

Я предполагаю, что вы на самом деле не беспокоили о Капитолийском писем, если мы можем каким-то образом организовать ввод выбор в типе enum. Вместо этого enum classes был бы лучшим выбором, если у вас есть C++11. Если нет, то это было бы довольно легко изменить этот код для нормальных перечислений

Если вы используете GCC/G ++, возможно, потребуется включить PREfix -std=c++11

Примечание: Вы можете добавить еще один enum элемент enum class Days, таких как null_day. Или еще лучше, убедитесь, что пользователь вводит правильный день, пока он/она не делает, не вести с программой (подсказка: используйте while цикл при использовании getline)

#include <iostream> 
#include <string> 
#include <cstring> 
#include <algorithm> 

using std::string; 
using std::transform; 
using std::cout; 
using std::cin; 
using std::endl; 

// only in C++ 11 
enum class Day {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};  

int main() { 

cout << "Enter the day of week: "; 

// store day from user input, transform all to lower case so 
// we don't bother with user input type (only error in spelling will be the problem now) 
string get_day; 
getline(cin, get_day); 
transform(get_day.begin(), get_day.end(), get_day.begin(), tolower); 

// define instance of enum class Day, and sort out what day user has input 
// note that if you do not initialize myDay object, it will set to the first 
// element in the enum class Day above (which is Monday). This will happen 
// if user input is not allowed to initialize it. See the << >> section below 
Day myDay; 
if (get_day == "monday") 
    myDay = Day::Monday; 
else if (get_day == "tuesday") 
    myDay = Day::Tuesday; 
else if (get_day == "wednesday") 
    myDay = Day::Wednesday; 
else if (get_day == "thursday") 
    myDay = Day::Thursday; 
else if (get_day == "friday") 
    myDay = Day::Friday;  
else if (get_day == "saturday") 
    myDay = Day::Saturday; 
else if (get_day == "sunday") 
    myDay = Day::Sunday; 
else 
    << ERROR CODE HERE >> 
    << MAYBE A WHILE LOOP UNTIL USER INPUTS CORRECT DATA >> 

// perform your calculations/operations/etc separate from above 
if (myDay == Day::Monday) 
    cout << "Moon" << endl; 

else if (myDay == Day::Tuesday) 
    cout << "Mars" << endl; //continue with the days etc... 

return 0; 

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