根据用户输入决定动态分配多少内存

Deciding how much memory to dynamically allocate based on user input

我需要编写一个程序来执行以下操作:

示例运行可能如下所示:

How many words do you wish to enter? 5 
Enter 5 words now:
I enjoyed doing this exercise
Here are your words:
I 
enjoyed 
doing 
this 
exercise

读取字符串时,程序应将字读入一个临时的char数组,使用malloc()分配足够的存储空间来存放字,并将地址存放在char数组中pointers.How处理这一步?

我的问题是:如何调整临时数组的大小以使其足够大以容纳用户可能输入的任意单词,然后如何将其传输到存储数组?

#include <stdio.h>
#include <stdlib.h>
enum { MAX_WORD_SIZE = sizeof("Supercalifragilisticexpialidocious") };
void resign(char**,int);
int main()
{
    char **p;
    int n,i;
    printf("How many words do you wish to enter?");
    scanf("%d",&n);
    p=calloc(n, sizeof(char*));
    puts("Here are your words:");
    resign(p,n);
    for (i=0; i<n; i++) {
        puts(p[i]);
    }
}
 void resign(char**p,int n)
{
    int i=0,j=0;
    char c;
    char * temp_word = NULL;
    getchar();
    temp_word = malloc(MAX_WORD_SIZE);
        while ((c=getchar())!='\n') {
        if (c!=' ') temp_word[i++]=c;
        else {temp_word[i]='[=11=]';
        p[j]=temp_word;
        temp_word = malloc(MAX_WORD_SIZE);
            i=0;j++;}
}
    temp_word[i]='[=11=]';
    p[j]=temp_word;
    free(temp_word);
}

这里是malloc()的描述。

它接受一个参数 size,以字节为单位。

所以如果用户输入了5个单词,那么你需要先分配一个足够大的数组来存储5个指针。

例如

char ** words = NULL;
words = malloc(sizeof(char *) * <NUMBER OF CHARACTERS THE USER ENTERED>);

如果我们假设正在使用 ASCII 并且字符是 char,那么每个单词中的每个字母都是一个字节。我们还需要考虑任何 spaces、换行符、可能是回车符 return 和尾随空值。

一个单词有多少个字母? IDK,这取决于你。但是如果我们假设 "Supercalifragilisticexpialidocious" from Mary Poppins 在我们遇到的最长单词中,那么我们需要分配至少 34 个字符,再加上一个额外的尾随空终止符。这样一来,每个字就剩下最多 35 个字节。

这会起作用:

enum { MAX_WORD_SIZE = sizeof("Supercalifragilisticexpialidocious") };

这也会考虑尾随 [=16=] - MAX_WORD_SIZE 将是 35。

char * temp_word = NULL;
temp_word = malloc(MAX_WORD_SIZE);

要创建所有其他单词数组,您需要在循环中执行类似的操作:

for(int i = 0; i< <NUMBER OF WORDS THE USER ENTERED>; i++)
{
    words[i] = malloc(MAX_WORD_SIZE);
}

要将用户输入的字数转换为整数,您应该使用 atoi()

在此之后,您可以使用 getchar() 从 stdin 中一次提取一个字符的字符串,并手动将它们放入您分配的临时文件中,当您到达 ' ' [=68= 时停止].

要将临时数组复制到您的单词数组之一,您可以使用 strcpy(),只需确保您的临时数组在单词后始终有尾部 [=16=]

完成后别忘了free()那个指针。

我假设您这样做是为了某种关于动态内存的家庭作业,这就是为什么您的应用程序是这样定义的。但如果你不是,你应该考虑先使用 fgets() 将输入读入一个缓冲区,然后在读取后使用 strtok() 拆分字符串。这种方法会占用更多内存,但会更干净。

您应该考虑做的另一件事是使用 calloc() 而不是 malloc() 来进行分配,这样您可以确保所有数组都初始化为 0 - 它可以使您免于如果这些数组中已经有垃圾数据,稍后会有些混乱。

还有一件事要考虑:这个例子中的临时数组可以使用 temp_word[MAX_WORD_SIZE]; 自动或静态分配,因为我使用枚举将 MAX_WORD_SIZE 存储为常量。不需要为此直接使用 malloc。