【问题标题】:How to return 2 char pointers from function?如何从函数返回 2 个字符指针?
【发布时间】:2020-06-25 10:39:44
【问题描述】:

我需要创建一个函数,该函数接受 pointer to part of a string返回 指向first word in the string 开头的指针和指向string after the word 的指针.

单词的字符定义为大写和小写字母,以及像'-'这样的字符。

主要是,我不确定我们如何从一个函数返回两个指针。

我也没有最好地掌握指针,所以我正在寻找任何关于这样的函数可能是什么样子的提示。

【问题讨论】:

  • 如果你将在 c 中传递一个字符串指针,你必须从字符串的开头而不是 medel 传递!因为您无法到达它的开头(除非您的字符串以特殊字符开头)... C 中的字符串 和大多数其他语言都以null @ 结尾987654324@ 字符,因此您可以知道结束的时间,但是如果您没有指向起始字符的显式指针,您将无法知道它从哪里开始......以及如何返回多指针,您可以看到@Adam
  • @IbramReda-这不是他要问的!再次阅读问题。他正在传递一个字符串,需要取回指向传递的字符串中不同位置的指针。
  • @Jack M 你能添加一个你期望的例子吗?
  • @IbramReda - 在 C 中你可以做任何你喜欢的事情。包括传递指向字符串中间的指针!
  • @IbramReda 我的目标是传递“你好,我饿了!”这样的行。并返回一个指向“h”的指针,第一个单词的开头和一个指向从“t”开始的字符串其余部分的指针。然后冲洗并重复,直到我从行中提取每个单词。

标签: c string pointers


【解决方案1】:

第一种方法

一种方法是在函数参数中返回结果(通过取消引用被调用者指针,他需要在调用语句中提供)

void process_my_string(const char* userString, char** ptr_firstWord, char** ptr_stringAfter);

我们怎么称呼它?

char* pfirst = NULL;
char* plast = NULL;
const char* str="hello c pointers";

process_my_string(str, &pfirst, &plast);

第二种方法

其中一个指针将在返回值中返回,另一个在函数传递的参数中返回(类似于第一种方法):

char* process_my_string(const char* userString, char** ptr_stringAfter);

我们怎么称呼它?

char* pfirst = NULL;
char* plast = NULL;
const char* str="hello c pointers";

pfirst = process_my_string(str, &plast);

第三种方法

structurearray 指针中返回指针(两者)。我选择在下面的s_return 结构中返回:

typedef struct{
   char* p_first;
   char* p_after;
} s_return;

现在函数变成:

s_return process_my_string(const char* userString);

我们怎么称呼它?

const char* str="hello c pointers";
s_return my_return = process_my_string(str);

/*access the pointers*/
printf("%s\n", my_return.p_first);
printf("%s\n", my_return.p_last);

【讨论】:

  • 谢谢,这很有帮助。另外,使用第一种方法,假设我在函数中提取了一个像 char *word = "hello" 这样的字符串,为了保存那个单词的地址,我写 ptr_firstWord = &word?
  • 关于在一个函数中“返回”多个值的好答案。但是您没有回答如何通过另一个指向字符串中间的指针来获取指向字符串开头的指针
  • @JackM - 你不能在 c 中做这样的事情,char* word = "hello"; 这必须是一个 const charconst char* word="hello";。按照第一种方法,如果您传递char* ptr_firstWord;,则指针本身就是原始字符串中的地址。
  • @Adam 我的错,我误解了
  • @Sunchock - 随意不要投票兄弟。所有的 stackoverflow 用户都是为了贡献和声誉而来的。 :-)。任何方式,如果你已经投票。谢谢。
猜你喜欢
  • 2012-11-12
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 2016-10-23
  • 2019-04-01
  • 2015-01-02
  • 1970-01-01
  • 2021-02-14
相关资源
最近更新 更多