我需要编写一个执行以下操作的程序:
示例运行可能如下所示:
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);
}
答案 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。