我需要编写一个执行以下操作的程序:
- 提示用户并询问他们希望输入多少个单词
- 使用 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/