【问题标题】:How to allocate memory for strings entered by a user in real time in C?如何为用户在C中实时输入的字符串分配内存?
【发布时间】:2014-03-06 20:17:31
【问题描述】:

我需要从用户那里(通过键盘)获取未知数量的字符串,并设置一个字符串指针数组,以便它指向所有输入的字符串。

我定义了一个变量char tmp_strng[] 来保存用户使用以下代码输入的字符串:

printf("Enter string number %d\n",num_of_strngs+1);
fflush(stdin);
scanf("%s",tmp_strng);

之后,我想为char *str_arr[] 分配更多内存,该数组将保存指向所有字符串的指针。一开始我用检查做内存分配:

if((tmp_str_arr[num_of_strngs]=realloc(str_arr,strlen(tmp_strng)))==NULL)
        {
            free(str_arr);
            printf("Error: couldn't allocate memory. Exiting.");
            return 1;
        }
str_arr[num_of_strngs]=tmp_str_arr[num_of_strngs];
str_arr[num_of_strngs++]=tmp_strng;

这真的行不通...谁能告诉我这里有什么问题(或正确)?我想尽可能坚持 realloc() 和 scanf() 作为这里的主要函数。

【问题讨论】:

  • fflush(stdin) 是未定义的行为(尽管它可能在某些实现中起作用)
  • 这不足以理解您的问题。请告诉我们什么是num_of_strngsstr_arrtmp_str_arr
  • 您不能重新分配数组。它们被固定为它们声明的大小。
  • num_of_strngs 是一个 int 变量,用于保存 str_arr[] 中的字符串数量(如果您愿意,可以使用数组长度)。 str_arr 被定义为 char *str_arr[];char *tmp_str_arr[]; 只是一个临时数组,我在分配失败时使用它,如果我不使用它并且分配失败,我将丢失整个数组。
  • @TerraOrbis - 我可以将内存分配给大小为 x 的数组,然后创建一个大小为 x+1 的新数组,并使用指向大小为 x 的数组的指针指向大小为 x 的数组吗? x+1?

标签: c arrays pointers malloc realloc


【解决方案1】:

使用getline()函数,它会自动malloc()有足够的内存来保存行。用法如下:

char* line = NULL;    //Setting this to NULL is important!
size_t bufferSize;
size_t characterCount = getline(&line, &bufferSize, stdin);
if(characterCount == (size_t)-1) {
    //error handling
} else {
    //do something with this line
    free(line);
}

getline() 函数就像asprintf() 一样是 POSIX-2008 标准的一部分。

【讨论】:

  • getline 返回一个ssize_t。这很重要,因为它可以返回 -1 并且您对 size_t 上毫无意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 2023-03-25
相关资源
最近更新 更多