2012-02-21 2 views
0

У меня есть указатель char * panimal_name. Этот указатель должен иметь возможность принимать только 20 символов, и если пользователь вводит больше, он должен попросить пользователя повторно ввести.Подтвердить длину символа char *, взятого из std :: cin

Я пробовал считать символы в потоке, а также использовать strlen(), однако у меня все еще возникают проблемы.

cout << "Enter Animal Name: "; 
cin.ignore(); 
cin.getline(panimal_name, 20); 

Любая помощь будет принята с благодарностью.

EDIT: Ну, я всего лишь хочу, чтобы у пользователя было не более 20 символов. Если это значение 20 превышено, он должен попросить пользователя повторно ввести действительный ввод. Однако в этой настройке он теперь испортил поток для моих следующих входов. Причина, по которой я использую это, а не std::string, заключается в том, что я изучаю указатели на данный момент.

P.S. Я знаю, что строка, вероятно, будет лучше в этой ситуации для удобства использования.

+2

Какие проблемы вы с? – theglauber

+3

Есть ли причина, почему вы не используете строку? – DumbCoder

+1

@ DumbCoder: по какой-то причине школы и университеты абсолютно не хотят, чтобы учащиеся использовали строковые типы данных. Они повторяют мантру «char *». (Кроме того, почти нет упоминания о какой-либо части STL) –

ответ

0

Используйте большой буфер для ввода пользователя и проверьте последний элемент своего буфера.

1

Вы можете использовать C++ методы ..

std::string somestring; 

std::cout << "Enter Animal Name: "; 
std::cin >> somestring; 

printf("someString = %s, and its length is %lu", somestring.c_str(), strlen(somestring.c_str())); 

вы можете также использовать больше C++ методы

std::string somestring; 

std::cout << "Enter Animal Name: "; 
std::cin >> somestring; 

std::cout << "animal is: "<< somestring << "and is of length: " << somestring.length(); 

Я думаю, вы могли бы сделать что-то с CIN в stringstream обойти таким образом, что Cin exctract работает.

+0

Не могли бы вы остановиться на последнем замечании? Как экстракт cin отличается от других потоков? –

+0

Немного иронично, как вы говорите «используйте методы C++», а затем используйте 'printf'. ;-) –

+0

konrad ... да, я мог бы просто удалить эту часть .. rob, позвольте мне попробовать что-то с кодом ... нормальное поведение экстракта идет в основном в следующее пространство ... вы можете сделать это рекурсивно, пока не в конце ... –

1

Согласно MSDN:

Если функция не извлекает никаких элементов или _Count - 1 элементов, он вызывает SetState (failbit) ...

Вы можете проверить для этого failbit увидеть если пользователь вводит больше данных, чем позволяет буфер?

1

Рассмотрим следующую программу:

#include <iostream> 
#include <string> 
#include <limits> 

// The easy way 
std::string f1() { 
    std::string result; 
    do { 
    std::cout << "Enter Animal Name: "; 
    std::getline(std::cin, result); 
    } while(result.size() == 0 || result.size() > 20); 
    return result; 
} 

// The hard way 
void f2(char *panimal_name) { 
    while(1) { 
    std::cout << "Enter Animal Name: "; 
    std::cin.getline(panimal_name, 20); 
    // getline can fail it is reaches EOF. Not much to do now but give up 
    if(std::cin.eof()) 
     return; 
    // If getline succeeds, then we can return 
    if(std::cin) 
     return; 
    // Otherwise, getline found too many chars before '\n'. Try again, 
    // but we have to clear the errors first. 
    std::cin.clear(); 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    } 
} 

int main() { 
    std::cout << "The easy way\n"; 
    std::cout << f1() << "\n\n"; 

    std::cout << "The hard way\n"; 
    char animal_name[20]; 
    f2(animal_name); 
    std::cout << animal_name << "\n"; 
} 
Смежные вопросы