Ncurses c / c ++ - getstr()非声明的char数组

时间:2017-01-15 22:24:15

标签: c++ arrays dynamic ncurses

我在Ncurses写的小项目。有代码我有问题。

 #include <curses.h>

int main()
{
    char *name;

    initscr();

    printw("Set your name: ");
    getstr(name = new char[sizeof name]);

    printw("Name: %s", name);

    getch();

    endwin();

    return 0;
}

我知道这段代码不起作用。我怎么做这个char数组在用户输入他想输入的内容时得到它的大小?编程工作不知道这个数组的大小,直到有人输入他的名字?我不希望用户输入他的名字的长度。我不想自己声明这个数组的大小我希望程序知道它需要创建的这个数组的大小。可能吗?想不出别的什么。

1 个答案:

答案 0 :(得分:0)

  

如果用户输入他想要输入的内容,这个char数组是如何获得它的大小的?

你不能在 C

  

程序可以不知道这个数组的大小,直到有人输入他的名字吗?

没有。你必须假设一个名称可能有多大,并为getstr()提供足够大的缓冲区。

  

我不希望用户输入他的名字长度。

如果缓冲区足够大,可以使用任何名称。

  

我不想自己声明这个数组的大小我希望程序知道它需要创建这个数组的大小。

如果您事先不知道阵列的大小,那么您的程序也不能。

  

有可能吗?

没有

如果您使用更高级别的语言进行编程,该语言从终端读取并返回正确长度的字符串,那么正在发生的事情和#34;是将输入读入大缓冲区,然后复制到返回给您的动态分配的正确长度的字符串。只需要一个大的缓冲区&#34;可以被所有输入调用使用,你永远不需要考虑它。

但是,在 C 中,作为一种非常低级的语言,你基本上必须自己这样做,所以当你从终端,管道或套接字等读取输入时,在阅读之前,你不能经常知道输入的大小,所以你必须将它读入一个你手动拥有的缓冲区&#34;预先确定的大小。

虽然不是一个完美的解决方案(有一些微妙的理由不这样做),如果你#include <limits.h>然后使用LINE_MAX作为输入缓冲区的大小,你(几乎)保证你的输入缓冲区不能溢出。