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

标签 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);
}

最佳答案

这里是malloc()的描述.

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

因此,如果用户输入了 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()一次从标准输入中提取字符串一个字符,然后手动将它们放入您分配的临时文件中,当您到达 ' ' 空间时停止。

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

完成后不要忘记free()该指针。

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

您应该考虑做的另一件事是使用 calloc() 而不是 malloc() 进行分配,这样您就可以确保所有数组都已初始化带有 0 - 如果这些数组中已经存在垃圾数据,它可以让您避免以后的一些困惑。

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

关于c - 根据用户输入决定动态分配多少内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27782806/

相关文章:

c - 为什么此代码中允许使用字符串而不允许使用数组?

c - 使用 fgets() 对 C 程序进行利用

c - 用C语言制作金字塔

c - c 中 4x4 矩阵的 getter 问题

c - 在 C 中反转字符串中的单词

pointers - 指向具有保存类型的接口(interface)的指针

c - 在 C 中迭代具有相同 vector 的矩阵

ios - 在 Swift 中将 UInt32 (UTF-32) 转换为字符串

java - 不同的 JRE 使用什么子串搜索算法?

c - 如何将字符数组分配给字符串文字