Получение строки, проверка заглавной буквы

0

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

Проблема, которую я получаю: компилируется отлично, но все, что вы вводите, каким-то образом перенаправляется по пути выполнения, который всегда возвращает "Retype w/the letter". Это происходит, если я набираю 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
    if (Day == ("monday") || ("tuesday")) не делает то, что, как вы думаете, делает.
  • 0
    Спасибо за точку. Я просто чувствую строки с этим кодом, и если я разделяю «понедельник» и «вторник» на отдельные строки, это работает, если я наберу «понедельник» или еще много чего. Благодарю. Я буду осторожен с логическим оператором ||, может быть, используется только для чисел
Показать ещё 2 комментария
Теги:
string

3 ответа

1

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

Если вы используете gcc/g++, вам может потребоваться включить префикс -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;

}
1

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

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

  • 0
    Да, я просто пытаюсь перевести мой код в два пути. Один заставляет пользователя повторно вводить день недели, если он говорит «понедельник», а другой - выводить данные, если он печатает «понедельник». Но все, кажется, идет по пути повторного набора. Если я введу «Понедельник», я скажу, чтобы набрать с большой буквы.
  • 0
    Хорошо, если if терпят неудачу, это говорит о том, что get_day не имеет ожидаемого значения. После преобразования выведите значение в двух угловых скобках, чтобы увидеть фактическое значение.
1

В ctype.h есть функция isupper, которая возвращает true, если char - это верхний регистр:

#include <ctype.h>

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню