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

时间:2015-01-05 15:38:36

标签: c string pointers

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

  • 提示用户并询问他们希望输入多少字词
  • 使用malloc()分配动态内存来存储每个单词
  • 动态分配另一个数组来存储指向每个单独字符串的指针,并用指针填充
  • 动态分配其他数组以临时存储传入的字
  • 提示用户输入与之前输入的字数相同的字符串。
  • 阅读用户'一次输入一个字的临时数组,一旦读出每个字,就将其传送到动态分配的数组之一。
  • 在完成所有这些之后,我应该能够单独打印每个单词。

示例运行可能如下所示:

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指针数组中。如何处理这一步?

以下是我的问题:如何将临时数组的大小设置为足以容纳用户可能输入的任意字词,然后如何将其传输到存储阵列?

#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]='\0';
        p[j]=temp_word;
        temp_word = malloc(MAX_WORD_SIZE);
            i=0;j++;}
}
    temp_word[i]='\0';
    p[j]=temp_word;
    free(temp_word);
}

1 个答案:

答案 0 :(得分:0)

以下是malloc()的说明。

它需要一个参数size,以字节为单位。

因此,如果用户输入了5个单词,那么您需要先分配一个足以存储5个指针的数组。

例如

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

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

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

这将有效:

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

这也将考虑尾随\0 - 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中拉出一个字符串,并手动将它们放入您分配的临时字符中,当您到达' '空格时停止。

要将临时数组复制到一个单词数组中,可以使用strcpy(),只需确保临时数组在单词后面始终有一个跟踪\0

当你完成时,别忘了free()指针。

我假设您正在为动态内存上的某种家庭作业分配这样做,这就是为什么您的应用程序按照它的方式定义的原因。但是如果你不是,你应该考虑首先使用fgets()将输入读入一个缓冲区,然后使用strtok()在读取后分割字符串。这种方法需要更多的记忆,但它会更清晰。

您应该考虑的另一件事是使用calloc()代替malloc()进行分配,这样您就可以确保所有数组都使用0&#39;来初始化 - 它可以节省如果这些数组中已经存在垃圾数据,那你以后会有些困惑。

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