2010-07-14 2 views
0

Имеет ли значение, если я использую строку или символ для простой функции ввода? (Он же у/п)Char или String?

Это то, что я использую в данный момент:

using namespace std; 

string somestr; 

getline(cin,somestr); 

if(somestr.empty()) 
{ //do something } 
else if (somestr == "y"){ 
//do something else 
} 
else{} 

И если это имеет смысл для пользователя полукокса, что бы эквивалентный код обугленного на это?

+0

Почему не вы используя формат 'std :: cin >> somestr'? –

+0

Что случилось с тем, как я его написал? – Tek

+1

@Amir: Обратите внимание, что существует разница между двумя: 'std :: getline (stream, string)' будет читать символы из потока до тех пор, пока не будет прочитана новая строка; 'stream >> string' будет считывать символы из потока до чтения пробела. –

ответ

5

Да, это важно, потому что std::string не может сравниться с char с использованием ==. Вы можете сравнить его с строкового литерала:

if (somestr == "y") 

или вы можете проверить начальный элемент std::string:

if (somestr[0] == 'y') 

В последнем случае вы можете проверить длину, а также, в противном случае вы принимаете такие материалы, как «яхта» и «желтый». Сравнение с строковым литералом, содержащим ожидаемый текст, вероятно, является лучшим выбором для большинства случаев использования.

+0

1.) Вы говорите, что, по вашему мнению, вы будете использовать string over char? 2.) Что было бы эквивалентом somestr.empty() для char?Так как это первая проверка в выражении if. – Tek

+0

@Tek: Возможно, я неправильно понял ваш вопрос. Вы хотите заменить '' y "' на '' y'' (как я интерпретировал ваш вопрос), или вы хотите заменить 'string somestr'' char somechar'? Если вы хотите последний, то, пока вы хотите только прочитать один символ от пользователя, отлично использовать 'char'. –

+0

@Tek: Что касается проверки ошибок, вы должны проверить, чтобы убедиться, что извлечение из потока завершилось проверкой 'if (cin)'; если этот тест завершился неудачно, извлечение завершилось неудачно. Вы даже должны сделать это, когда вызываете 'getline'. –

2

Я думаю, что Джеймс Макнеллис дает хорошее объяснение, почему вы будете использовать любой случай. Лично, если вы задаете вопрос «да/нет», я считаю, что единственный символ проще, поскольку он минимизирует количество различных сценариев, с которыми вам приходится иметь дело.

Вот некоторые примеры кода, которые можно использовать, чтобы прочитать ответ от пользователя с помощью одного символа:

#include <iostream> 
#include <limits> 

using namespace std; 

int main() 
{ 
    //keep looping until the user enters something valid 
    while(true) 
    { 
    char answer; 
    cout << "Does this sound good (y/n)? "; 
    cin >> answer; 

    if(answer == 'y' || answer == 'Y') 
    { 
     //user entered yes, do some stuff and leave the loop 
     cout << "You answered yes!" << endl; 
     break; 
    } 
    else if(answer == 'n' || answer == 'N') 
    { 
     //user entered no, do some stuff and leave the loop 
     cout << "You answered no!" << endl; 
     break; 
    } 
    else 
    { 
     cout << "You did not enter a valid answer. Please try again." << endl; 

     //if we got bad input (not 'y'/'Y' or 'n'/'N'), wipe cin and try again 
     cin.clear(); 
     cin.ignore(numeric_limits<int>::max(),'\n'); 
    } 
    } 
} 

Если вы планируете на чтение более одного ответа персонажа, хотя, я думаю, что вы вероятно, отлично с getline и так рассуждать.

0

Лучше использовать символ, потому что нужно хранить только один символ

с использованием патезраса;

char chr;

getline (cin, chr);

если (CHR == NULL) {// делать что-то} еще если (CHR == "у") {// делать что-то еще } еще {}