Ncurses c/getstr()未声明的char数组

Ncurses c/getstr() non declared char array

本文关键字:未声明 char 数组 getstr Ncurses      更新时间:2023-10-16

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

当用户键入他想要键入的内容时,我该如何使这个char数组获得其大小?

您不能在C中使用。

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

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

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

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

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

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

有可能吗?

否。

如果您使用从终端读取并返回正确长度字符串的高级语言进行编程,那么"隐藏"的情况是,输入被读取到一个大缓冲区中,然后复制到一个动态分配的正确长度字符串中,然后返回给您。只需要有一个"大缓冲区"就可以被所有的输入调用使用,而且你永远不需要考虑它

然而,在C中,作为一种相当低级的语言,你基本上必须自己完成这项工作,所以当你从终端、管道或套接字等读取输入时,你通常无法在读取之前判断输入的大小,所以你必须将其读取到一个缓冲区中,该缓冲区已经"手动"预先调整大小,使其足够大。

虽然这不是一个完美的解决方案(有一些微妙的原因不这样做),但如果#include <limits.h>然后使用LINE_MAX来确定输入缓冲区的大小,则(几乎)可以保证输入缓冲区不会溢出。