验证从std :: cin获取的char *的长度

时间:2012-02-21 17:15:45

标签: c++ validation pointers iostream

我有一个名为char * panimal_name的指针。此指针应该只能包含20个字符,如果用户输入更多字符,则必须要求用户重新输入。

我已尝试计算流中的字符并使用strlen(),但我仍然遇到问题。

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

任何帮助都将不胜感激。

编辑:我只想让用户最多拿20个字符。如果超过20,则应该要求用户重新输入有效输入。但是在这个设置中,它现在会混淆我的下一个输入流。我使用它而不是std::string的原因是我现在正在学习指针。

P.S。我知道在这种情况下,为了便于使用,字符串可能会更好。

4 个答案:

答案 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做一些字符串流来绕过cin exctract的工作方式。

答案 1 :(得分:1)

根据MSDN:

  

如果函数不提取元素或_Count - 1个元素,则调用   setstate这(failbit)...

您可以检查该failbit以查看用户是否输入的数据多于缓冲区允许的数据?

答案 2 :(得分: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";
}

答案 3 :(得分:0)

使用更大的缓冲区进行用户输入,并检查缓冲区的最后一个元素。