这是我的C ++函数:
void SetUserName(char username[])
{
cout << "\nPlease enter a username.\n"
<< "Must not be longer than 12 characters.\n>> ";
cin.getline(username, MAX) // MAX is globally defined
while(strlen(username) > MAX)
{
cout << "\nUsername too long, try again.\n>> ";
cin.getline(username, MAX);
}
}
显然,while循环永远不会起作用,因为每次都会将用户输入截断为12个字符。
如何有效地确定用户输入是否太长,并继续循环直到满足条件?
修改 在此处使用cstring
是一项要求。我已经知道字符串是多么容易。
编辑#2:这对我来说绝对是一个富有成效的问题,因为它教会了我很多。最终代码:http://pastie.org/3537894
答案 0 :(得分:4)
C风格的终止字符串使用相当棘手,几乎在所有情况下我都推荐使用C ++ std::string
。但是,既然你说你特意想把一个终止的字符串读入一个数组,这就是一种方法。
请记住,数组大小必须为MAX+1
,因此MAX
字符的空格后跟终结符。
istream::getline
会设置流failbit
标记;你可以在阅读后测试一下。如果只提取了一条偏线,并且你想要转到下一行,那么你需要清除错误状态,并忽略该行的其余部分。
while (!std::cin.getline(buffer, MAX+1)) {
std::cout << "Too long\n";
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
答案 1 :(得分:3)
使用正确的C ++(特别是string
和免费的getline
函数):
#include <string>
#include <iostream>
std::string line;
while (std::getline(std::cin, line))
{
if (line.length() > 12)
{
// error, line too long
continue;
}
// process line
}
答案 2 :(得分:3)
如果你想知道std::istream::getline()
是否读取了一个满是字符的数组而不是行尾字符,你需要弄清楚存储字符的数量(减去终止空值)是否与提取的字符。也就是说,以下确定行上是否有超过12个字符(终止空值需要第13个字符):
#include <iostream>
#include <string.h>
int main()
{
char array[13];
if (std::cin.getline(array, 13).gcount() == strlen(array)) {
std::cout << "excess characters on the line\n";
}
}
如果您接下来还要删除流中多余的字符,请使用std::cin.ignore(std::numeric_limits<std::streamsize>::max());
之类的内容。由于这也被标记为C,我不知道如何使用C来解决这个问题,但我非常确定有类似gcount()
的内容。
实际上,仔细查看规范std::istream:getline()
实际设置std::ios_base::failbit
,如果它在阅读字符时没有遇到换行符(当没有字符时它也设置std::ios_base:failbit
读取但如果在到达文件结尾之前至少读取了一个字符,则不会设置std::ios_base::failbit
。这意味着,您还希望在忽略多余字符之前清除流,然后您可以关闭std::ios_base::failbit
和std::ios_base::eof()
:
#include <iostream>
#include <limits>
#include <string.h>
int main()
{
char array[13];
std::cout << "enter password: ";
while (!std::cin.getline(array, 13) && !std::cin.eof())
{
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "password is too long: enter max 12 chars: ";
}
std::cout << "the password is '" << array << "'\n";
}
自std::ios_base::failbit
设置后,您需要先调用clear()
,然后才能使用该流。
答案 3 :(得分:1)
如果用户输入的字符数多于您允许的数量,则必须至少超过一个字符超过限制。由于用户“超出”您的限制的字符数与您无关,因此您可以将MAX+1
作为限制,并查看长度是否大于MAX
。
当然,您需要在缓冲区中留出足够的空间来容纳第13个字符和零终止符。 编辑您还需要在每次失败的尝试时调用ignore
跳到行尾。