如何编写一个函数,该函数接受一行文本,并将每个单词保存在指向 char 指针的指针中并返回该指针

Posted

技术标签:

【中文标题】如何编写一个函数,该函数接受一行文本,并将每个单词保存在指向 char 指针的指针中并返回该指针【英文标题】:How to write a function that takes a line o text, and saves each word in a pointer to pointer to char and returns that pointer 【发布时间】:2020-12-27 22:22:49 【问题描述】:

我正在尝试编写一个给定文本字符串的函数(这将是一个 shell 命令),现在我只需要提取单词,因此删除空格并将每个单词保存在指向 char 指针的指针中。我的想法是这样做,但 gcc 编译器会返回“从不兼容的指针类型返回”的警告

代码:

char **getargs(char *command)
                                                                                                  
  static char arguments[MAXARG][CMDLENGTH];                                                      
  int i = 0, word = 0, letter = 0, status = OUT;                                                 
                                                                                                 
  while(command[i] != '\0')                                                                      
                                                                                                
      if(isspace(command[i]) && status == IN)                                                    
                                                                                                
          arguments[word][letter] = '\0';                                                        
          letter = 0;                                                                            
          word++;                                                                                
          status = OUT;                                                                          
          i++;                                                                                   
                                                                                                
      else if(!isspace(command[i]) && status == OUT)                                             
                                                                                                
          arguments[word][letter] = command[i];
          status = IN;
          letter++;
          i++;
      
      else if(!isspace(command[i] && status == IN))
      
          arguments[word][letter] = command[i];
          letter++;
          i++;
      
      else if(isspace(command[i]) && status == OUT)
          i++;
  

  return arguments;                                                                              
  

编辑:另外,我还发现为了返回一个在本地声明的指针,它需要被声明为静态的,这是为什么呢?

【问题讨论】:

“我还发现,为了返回一个在本地声明的指针,它需要声明为静态的,这是为什么呢?” --> 不正确的前提。这是一种方式,但不一定非要如此。代码可以分配,调用者可以传入要保存的数据位置,全局内存,可以修改char *command,... 你应该动态分配arguments***.com/questions/11656532/… 【参考方案1】:

你的函数签名承诺返回一个char **,一个指向char的指针。这意味着如果返回值是r,那么*r 将必须是一个指针,您放置在某处的某些字符。调用函数可以定义一个字符指针cp = *r,然后*cp 将是第一个字符,printf(cp); 将打印函数找到的第一个单词。

但这不是您实际返回的内容:您不是返回指向指针的指针,这就是编译器发出警告的原因。

您返回的是一个二维数组 - 即 MAXARG*CMDLENGTH 字符,一个接一个 - 并且该数组以指向其起点的指针的形式自动返回。所以r 是指向数组开头的指针,*r 是数组中的第一项,它是一些字符 - 但肯定不是指针(字符通常是单个字节,指针通常是 4 或 8 个字节并包含一些内存地址)。根据您的函数签名使用会完全错误:cp = *r 会占用您的 4 或 8 个字符并将它们解释为一个内存地址...

解决方案在the post linked by Davide in the comments 和该问题的其他答案中。函数内的静态数组也可以工作,只要函数签名明确它会返回一个指针 - 例如

void *getargs(char *command)

然后可以从其他地方调用它并放入一个指向正确大小的数组的指针,

char (*r)[CMDLENGTH] = getargs("one two three"); // r = pointer to char[CMDLENGTH]
printf("first arg: %s\n", r[0]);
printf("second arg: %s\n", r[1]);
printf("third arg: %s\n", r[2]);

这有点难看;我个人更喜欢链接帖子中的解决方案#2。

【讨论】:

以上是关于如何编写一个函数,该函数接受一行文本,并将每个单词保存在指向 char 指针的指针中并返回该指针的主要内容,如果未能解决你的问题,请参考以下文章

理解MapReduce计算构架

理解MapReduce计算构架

理解MapReduce

理解MapReduce计算构架

理解MapReduce

理解MapReduce