如何编写一个函数,该函数接受一行文本,并将每个单词保存在指向 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 指针的指针中并返回该指针的主要内容,如果未能解决你的问题,请参考以下文章