То, что я пытаюсь сделать, это проверить, имеет ли строка, содержащая пользователь, прописную букву или нет. Первая часть кода с перечислимой константой существует только для другого метода, который я должен использовать, используя числа, назначенные словам 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;
}
Я предполагаю, что на самом деле вы не беспокоитесь о письмах с капитолиями, если мы можем каким-то образом организовать выбор ввода в типе 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;
}
Можно было бы заметить, что есть функция, называемая toupper, которая может превратить строчную букву в верхний регистр и оставить только букву в верхнем регистре. Возможно, вы можете повторно использовать эту функцию, чтобы помочь решить вашу проблему с меньшим количеством кода.
Я выхожу из вашего кода, что вас интересует только проверка того, что первая буква является заглавной. Это верно?
В ctype.h есть функция isupper, которая возвращает true, если char
- это верхний регистр:
#include <ctype.h>
...
isCapitalized = isupper(str[0]);
...
if (Day == ("monday") || ("tuesday"))
не делает то, что, как вы думаете, делает.