【问题标题】:Ncurses c/c++ - getstr() non declared char arrayNcurses c/c++ - getstr() 非声明字符数组
【发布时间】:2017-01-15 22:24:14
【问题描述】:

我正在用 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 数组的大小?在有人输入他的名字之前,程序可以不知道这个数组的大小吗?我不希望用户输入他的名字的长度。我不想自己声明这个数组的大小我想让程序知道它需要创建的这个数组的大小。是否可以?想不出别的了。

【问题讨论】:

标签: c++ arrays dynamic ncurses


【解决方案1】:

当用户输入他想输入的内容时,我该如何让这个 char 数组获得它的大小?

你不能在C中。

在有人输入他的名字之前,程序可以在不知道这个数组大小的情况下工作吗?

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

我不想让用户输入他的名字的长度。

如果缓冲区足够大,可以容纳任何名称,则不需要这样做。

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

如果你事先不知道数组的大小,你的程序也不能。

有可能吗?

没有。

如果您使用从终端读取并返回正确长度的字符串的高级语言进行编程,“幕后”发生的事情是输入被读入一个大缓冲区,然后动态复制到返回给您的正确长度的分配字符串。只需要一个“大缓冲区”就可以供所有输入调用使用,您无需考虑它。

然而,在C中,作为一种相当低级的语言,你基本上必须自己做这件事,所以当你从终端、管道或套接字等读取输入时,在读取输入之前,您通常无法判断输入的大小,因此您必须将其读取到您已“手动”预先设置大小以使其足够大的缓冲区中。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-25
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    相关资源
    最近更新 更多