gpt4 book ai didi

C 按引用传递、单维和多维

转载 作者:行者123 更新时间:2023-11-30 15:42:59 25 4
gpt4 key购买 nike

好的,我知道这可能会被标记为重复,但我已经到处搜索但无法弄清楚这一点,所以请耐心等待。

首先我要说的是,这是一个家庭作业,所以我无法更改函数参数类型。

此外,我不允许使用任何库(嗯,在进行更改的函数内部)。

第 1 部分

<小时/>首先,我将如何实现这一目标:

void changeMe(char* s, int size) {
//Change s to be "Hello, World!"
}

int main(void) {
char* c;
changeMe(c, 13);
printf("%s", c); //Print out "Hello, World!"
}

(作业不需要“Hello,World!”位,但我不需要逻辑方面的帮助,只需更改传递的变量即可。)

我查遍了,大多数答案都是这样的 here ,这表示我需要将参数设置为 char** schar*& s 才能更改它。

我唯一的选择是假设在传递之前已经为 s 分配了足够的内存吗?例如:

void changeMe(char* s, int size) {
int i;
for (i = 0; i < size - 1; i++) s[i] = 'a';
s[size - 1] = '\0';
}

int main(void) {
char* c = (char*) malloc(10 * sizeof(char)) ;
changeMe(c, 10);
printf("%s", c); //Prints out "aaaaaaaaa"
}

这工作正常,但从 c 声明中删除 malloc(...) 却不行。

malloc(...) 放入 changeMe(...) 函数中可以在本地工作,但仅持续 changeMe > 在范围内。

有没有一种方法可以更改我的 char* c 而无需假设它在传递给函数之前分配有足够的内存?

第 2 部分

<小时/>

这几乎属于与上面相同的类别,所以我在这里将做一些简单的解释。

功能:

void split(char* s, char** sub, int max, char sep) {
//Split string s by sep char, store all substrings found into sub
//sub will have at most max substrings in it.
}

我并不是在寻求帮助编写通过 char c 查找和拆分 char* s 的逻辑。我能做到。我的问题主要与上面相同。如何为 char** sub 分配内存,以便它可以容纳其中的所有子字符串(当然,还可以更改传递的变量)。

例如:

void split(char* s, char** sub, int max, char sep) {
//-->(Needed) Make sub able to hold max strings.
//(Not Needed) Logic for splitting s up by sep, creating a substring.
//-->(Needed) Making sub[i] have memory to hold current substring.
}

int main(void) {
char* s = "Some String To Use";
char** subs;
split(s, subs, 10, ' ');
//subs should look like this:
//{"Some", "String", "To", "Use"}
}

我不需要帮助完成实际工作,我只是对如何将 subs 传递到 split(...) 并让它分配适当的内存并更改subs

<小时/>

如果您已经回答了我的问题,感谢您的阅读。

而且,在所有“你尝试过谷歌吗”评论出现之前,是的。以下是我到目前为止所看到的一些内容:

(编辑:谢谢黑客为我添加超链接。)

同样,如果我为自己编写此内容,我会更改参数(例如,使用 char** s 而不是 char* s),并使用 Nice,有用的函数,如 strcpy 等,但在这种情况下我不能这样做。任何帮助/意见将不胜感激,非常感谢大家!

最佳答案

第 1 部分

size 参数的全部意义在于让函数 changeMe() 了解缓冲区的大小。您不需要假设大小,因为通常这样的函数将按如下方式使用:

int main()
{
int size;
char* c;

// some code to calculate the required size of the buffer in bytes
size = calculateRequiredSize();

// allocate the buffer
c = ( char* )malloc( size );

changeMe( c, size );
}

但是,针对您的问题,在函数 changeMe() 中,如果不假设内存缓冲区大小为 ,则无法更改存储在缓冲区中的数据> 字节已经分配。

第 2 部分

这里的逻辑相同,尽管它被分成(双关语)两部分。

只需修改您的示例,您将执行以下操作:

void split(char* s, char** sub, int max, char sep) {

char* pCurrent; // pointer to the beginning of the current substring inside the original string.
int lenCurrent; // length of the current substring

// Making sub[i] have memory to hold current substring.
int i;
for ( i = 0; i < max; ++i )
{
//(Not Needed) Logic for splitting s up by sep, creating a substring.
// OK -> I leave it to you.

sub[i] = (char *)malloc( lenCurrent + 1 ); // use length of the current substring + an extra space for the terminating NULL character

// I will leave it to you to copy the substring to sub[i]
}
}

int main(void) {
char* s = "Some String To Use";
int max = 10; // Decide the value of max out here.
char** subs = (char**)malloc( max * sizeof( char* ) );
// Make subs able to hold max strings.
split(s, subs, max, ' ');
//subs should look like this:
//{"Some", "String", "To", "Use"}
}

关于C 按引用传递、单维和多维,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19972336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com