在C ++中使用cin.get()时,如何限制用户可以输入的字符数?

时间:2016-02-25 05:07:47

标签: c++

我试图使用cin.get()获取用户输入,但我不想限制他们可以输入的字符数量。我怎么能这样做?

编辑:我想用一种更好的方式来表达这一点:我如何动态更改字符数组以适应用户输入的长度?

3 个答案:

答案 0 :(得分:1)

这是C ++程序的一个奇怪的要求。您当然可以采用C方式,只要输入超出当前可用内存,就可以继续获得更多内存。它是这样的(警告:前面的代码片段):

while(cin.get(c)) {
    if (cur_pos == cur_len) {
        cur_len = grow_charbuf(buffer, cur_len);
    }
    buffer[cur_pos++] = c;
}   

这里,grow函数变得难看。它需要分配更大的内存,将当前缓冲区的内容复制到其开头,处理当前缓冲区占用的内存,并返回新的大小。例如,沿着这些方向:

char* new_charbuf(size_t len) {
    return new char [len];
}

size_t grow_charbuf(char* buf, size_t cur_len) {
    size_t new_len = cur_len * 2;
    char* new_buf = new char [new_len];
    // copy old buffer contents to new buffer
    delete[] buf;
    buf = new_buf;
    return new_len;
}

然后您可以按如下方式使用它:

cur_len = 1000; // or whatever
char* buffer = new_charbur(cur_len);
// write into the buffer, calling grow_charbuf() when necessary
// and don't forget to free the memory once you are done...
// or don't free it, if the program eventually exits anyway

这是可怕的代码。它可能会起作用,但如果你能避免它,你就永远不应该用C ++来做这件事。除此之外,我避免处理此代码可能导致的任何错误条件或异常。这只是为了说明这个想法。

手动管理内存是一个坏主意,因为它需要大量代码并且不容易正确。如果您的程序具有已知的,有限的寿命,您可以少花钱。

答案 1 :(得分:0)

根本不要使用字符数组。使用std :: string或其他标准容器。 因此学习使用溪流。

这是一个例子。它会读取与用户输入的字符一样多的字符,直到用户按下回车键。正如您所见,没有明确的缓冲区大小:

/////TEST PUT ANYWHERE IN GLOBAL SCOPE
#include <string>
#include <sstream>
#include <iostream>

using namespace std;

int test()
{
    //SET BP HERE AND STEP THROUGH
    string line;        
    getline(cin,line);
    std::stringstream user_input( line );

    while(!user_input.eof())
    {
        string word;
        user_input >> word;
            cout << word << endl;
    }

    return 0;
}

static int _test = test();
/////END TEST

答案 2 :(得分:-2)

你需要一个cin.getline()。换句话说,您需要具有指定大小的char数组并使用它,如下所示:

使用cin.get()

char str[100];
char sayHello[100];

cin.get(str, 100);
// make sure to add cin.ignore() or program will terminate right before next cin().
cin.ignore(); 

cout << str << endl;
cin.get(sayHello, 100);

cout << sayHello;

或cin.getline()

char input[100];
cin.ignore(); // stops the sentence from truncating.
cin.getline(input,sizeof(input));

您还可以对字符串使用getline():

string name;
getline(cin, name);

问题在于,在c ++中接收输入时,你的cin会查找0,即句子中的空格。然后它认为这是结束。