我需要一些关于在C中动态分配指针数组的帮助。我正在尝试创建一个程序,从用户输入读取单词的句子,并将单词存储在字符数组字符串中。然后,我想将指针char **wordArray
保存到指针数组char **varArray
中的这些单词中。
为单词的动态分配创建一个工作方法很容易,它从用户输入中逐字逐句读取。但是,尝试将此方法用于指针数组是比较棘手的。
当前函数char c
显然存在缺陷,但我的想法是“当用户输入时,获取指针数组的单词指针”。它现在有效地循环每个char **varArray()
的第一个单词。
我的问题是,如何实现指针数组的动态内存分配的第二层(char *word()
)?该功能如何检测何时调用/*CREATES AND ALLOCATES DYNAMIC VARIABLE ARRAY*/
#include <stdio.h>
#include <stdlib.h>
char **varArray();
char *word();
char **varArray()
{
char **tmp=NULL;
char **wordArray=NULL;
size_t size=0;
char c = EOF;
int words=0;
while(c) {
c=getc(stdin);
if (c == EOF || c == '\n')
c=0;
if (size <= words) {
size+=sizeof(char *);
tmp = realloc(wordArray,size);
if(tmp == NULL) {
free(wordArray);
wordArray=NULL;
printf("Memory allocation failed. Aborted.\n");
break;
}
wordArray=tmp;
}
words++;
wordArray[words]= word();
return wordArray;
}
?
当然,对代码,样式或其他错误的反馈表示赞赏。我的水平是中级初学者。
/*GETS ONE WORD FROM USER INPUT*/
char *word()
{
char *word=NULL, *tmp=NULL;
size_t size=0;
char c = EOF;
int letters=0;
while(c) { //reads character by character
c=getc(stdin);
if (c == EOF || c == '\n' || c==' ') //remove ' ' to read all input
c =0;
if (size <= letters) { //increase and reallocate memory
size = size + sizeof(char);
tmp = realloc(word,size);
if (tmp==NULL) { //check if allocation failed
free(word);
word=NULL;
printf("Memory allocation failed. Aborted.\n");
break;
}
word= tmp;
}
letters=letters+1;
word[letters]=c;
}
/*ADD SENTINEL CHARACTER*/
letters++;
size += sizeof(char);
word = realloc(word,size);
word[letters]='\n';
return word;
}
检索一个单词的方法:
{{1}}
答案 0 :(得分:1)
这是您要编写的程序的骨架。
...
char* currentWord;
char **wordArray=NULL;
while ((currentWord = word()) != NULL) {
.... add current word to word array with realloc...
}
....
char* word() {
int ch;
char* outputWord = NULL;
while ((ch = getch()) != EOF) {
if ( ... ch is a word character ... )
... add ch to output word with realloc ...
else {
char* ret = outputWord;
outputWord = NULL;
return ret;
}
}
return NULL;
}
请注意两个while
循环如何完全相同。
while ((element = getNextElement()) != sentinelValue) {
.... process newly obtained element ....
}
答案 1 :(得分:0)
我现在已经成功实现了@n.m提供的shell版本。但是,出现了另一个问题 - 由于word()
依赖于哨兵换行符\n
来退出,它也无法读取最后一个单词,并且不会在最后一个重要时间进入循环。
我试图实现一些if-cases,但这些因为while条件而失败。另一个想法是实现一些开关案例,但我不确定这会避免while循环的肮脏吗?
请注意,代码几乎没有错误检查以最大限度地减少混乱。
char **wordArray() {
char *currentWord;
char **wordArray=NULL;
size_t size=0;
int i=0;
while((currentWord = word()) != NULL) {
size+=sizeof(char *);
wordArray=(char **) realloc(wordArray,size);
wordArray[i]=currentWord;
printf("Test - Current word: %s\n",currentWord);
i++;
}
return wordArray;
}
相关的word()
功能:
char *word() {
char ch;
int i=0;
size_t size=0;
char *returnWord = NULL;
char *outputWord = NULL;
char *tmp = NULL;
while((ch = getc(stdin)) != EOF && ch !='\n') { //&& ch !='\n'
if (ch != ' ' ) { //&& ch !='\n'
size += sizeof(char);
tmp = (char *) realloc(outputWord,size);
outputWord= tmp;
outputWord[i]=ch;
printf("Test1: %c\n",*(outputWord+i));
i++;
} else {
printf("Test2: %s\n",outputWord);
returnWord=outputWord;
outputWord=NULL;
printf("Test3: %s\n",returnWord);
return returnWord;
}
}
return NULL;
}