知道getline cstring赋值后的初始用户输入

时间:2012-03-06 23:06:48

标签: c++ c cstring c-strings

这是我的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

4 个答案:

答案 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::failbitstd::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跳到行尾。