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

标签 python c pointers slice memory-address

我一直在想像 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/

相关文章:

python - 使用gather_nd构建矩阵

c - 使用gmp编译时出错

python - 检查字符串是否包含列表项

python - 为什么计算优先附着是昂贵的?

python - python 中的赋值 "="行为?

c - 从 stdin 向 fgets 发送任意字节

c - Raspberry PI,如何配置其他 GPIO 作为 I2C 工作

c++ - 如果ap是一个指针,为什么我可以通过ap[i]来引用它的值呢?

c++ - 为了在 C++ 中易于使用,使用引用而不是指针的合理性如何?

pointers - go中的form参数为map时,传入的是什么?