我有一个名为char * panimal_name
的指针。此指针应该只能包含20个字符,如果用户输入更多字符,则必须要求用户重新输入。
我已尝试计算流中的字符并使用strlen()
,但我仍然遇到问题。
cout << "Enter Animal Name: ";
cin.ignore();
cin.getline(panimal_name, 20);
任何帮助都将不胜感激。
编辑:我只想让用户最多拿20个字符。如果超过20,则应该要求用户重新输入有效输入。但是在这个设置中,它现在会混淆我的下一个输入流。我使用它而不是std::string
的原因是我现在正在学习指针。
P.S。我知道在这种情况下,为了便于使用,字符串可能会更好。
答案 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)
使用更大的缓冲区进行用户输入,并检查缓冲区的最后一个元素。