来自用户输入的动态指针数组

时间:2017-10-07 19:40:05

标签: c arrays pointers io dynamic-memory-allocation

我需要一些关于在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}}

2 个答案:

答案 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;
}