gpt4 book ai didi

python - 与 Python 相比,C 中的切片

转载 作者:太空宇宙 更新时间:2023-11-04 00:46:11 24 4
gpt4 key购买 nike

我一直在想像 Python 的 splice 这样的子串方法,例如“你好”[2:4]。

OLD:指针newtoret(返回)是相同的,但是当存储在hello,它有一个新地址。有没有办法维护地址并打印出切片?

:将字符放入缓冲区的最佳方式是什么?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//char * substr(char *str, int start, int end);
//void substr(char *str, int start, int end);
void get_substr(char *str, int start, int end, char *buffer);

int main() {
char word[] = "Clayton";
char buffer[15];
printf("buffer is now %s",get_substr(word,2,5,buffer);
return 0;
}


void get_substr(char *str, int start, int end, char *buffer) {
int length = end - start;
printf("length %d\n",length);
//char buffer[length]; //init normal array
//assign values from *str
int i;
for (i = 0; i < length; i++) {
buffer[i] = *(str+i+start);
}
}


//char * substr(char *str, int start, int end) {
/* char * substr(char *str, int start, int end) {
int length = end - start;
printf("length %d\n",length);
char buffer[length]; //init normal array
//assign values from *str
int i;
for (i = 0; i < length; i++) {
buffer[i] = *(str+i+start);
printf("i=%d buffer[i]=%c ptr=%c\n",i,buffer[i],*(str+i+start));
}
//add endline if not present
if (buffer[length] != '\0') {
buffer[length] = '\0';
printf("buffer[%d] is %c\n",length,buffer[length]);
printf("0 added\n");
}
printf("buffer %s %p\n",buffer,buffer);
printf("len(buffer) is %d\n",strlen(buffer));
char *toret;
toret = (char*) &buffer;
printf("toret %s %p\n",toret,toret);
return toret;
} */

抱歉,这可能是重复的,但我无法在此域中找到相同的示例。 我是 C 新手!

最佳答案

您不能返回指向函数内局部声明的缓冲区的指针。该内存驻留在堆栈中,下一个函数调用可能会覆盖该内存。如果要将它返回给调用函数,则需要使用 malloc 创建所需的内存,然后需要使用 free 清理,一旦你完成了。

也就是说,在被调用函数中分配内存并返回它通常是不明智的。为了防止调用者忘记清理内存,我建议请求一个缓冲区,子字符串将被复制到其中。

我会更改函数签名以返回 void,并占用一个额外的缓冲区,子字符串将复制到该缓冲区中:

void get_substr(char *str, int start, int end, char *buffer)

然后,在您的调用函数中,您可以这样做:

int main() {
char name[] = "Clayton";
char buffer[10];

get_substr(name, 0, 3, buffer);
/* "Cla" now copied into buffer */

printf("%s", buffer);
return 0;
}

或者,由于这是一个子字符串函数,并且您知道字符串完全包含在原始字符串中,您可以返回字符串长度的大小和指向字符串开头的指针(在原始字符串中) .

您的签名可能如下所示:

int substr(char *str, int start, int end, char *substr)

用法可能是这样的:

int main() {
char name[] = "Clayton";
char *substr;
int substr_len = substr(name, 0, 3, substr);
/* substr now points to name, substr_len = 3 */

/* Copy substring to buffer to print */
char buffer[10];
strncpy(buffer, substr, substr_len);

printf("%s", buffer);
return 0;
}

关于python - 与 Python 相比,C 中的切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38405690/

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