Проверьте длину символа *, взятого из std :: cin - PullRequest
0 голосов
/ 21 февраля 2012

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

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

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

Любая помощь будет оценена.

РЕДАКТИРОВАТЬ: Ну, я хочу, чтобы он принимал не более 20 символов от пользователя. Если этот 20 превышен, он должен затем попросить пользователя повторно ввести действительный ввод. Однако в этой настройке он теперь портит поток для моих следующих входов. Причина, по которой я использую это, а не std::string, заключается в том, что я сейчас изучаю указатели.

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

Ответы [ 4 ]

1 голос
/ 21 февраля 2012

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

#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";
}
1 голос
/ 21 февраля 2012

Вы можете использовать методы 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 для потока строк, чтобы обойтикак работает cin exctract.

1 голос
/ 21 февраля 2012

По данным MSDN:

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

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

0 голосов
/ 21 февраля 2012

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

...