字符串指针的子串指针

时间:2016-09-26 20:49:40

标签: c pointers

我对C很陌生,并且对以下内容感到困惑。

  

考虑一个字符串(指向字符数组的指针),包含任意数量的无符号字节,在我们的例子中,让它为programming。编写一个函数,它返回一个指向内存中 new 位置的指针(但没有用malloc分配),包含任意但固定大小的子串,在任意偏移处 - 在我们的例子中,让它为gramm

我尝试了以下内容:

unsigned char* newptr(unsigned char* p, int offset, int size) {
    unsigned char r[size];
    memcpy(r, p + offset, size + 1);
    return r;
}

但是Segmentation fault出错了。否则

unsigned char* newptr = oldptr + offset;

有效,但它没有解决固定大小的问题 - 我不希望其余的字符属于指针。

提前致谢,如果之前提出过这个问题,我很抱歉,我无法找到任何帮助。

1 个答案:

答案 0 :(得分:0)

一些可能的解决方案,所有这些都是非最佳的:

使用全局缓冲区(使用全局变量是不好的做法,如果再次调用该函数,它会重写缓冲区,缓冲区的大小固定,并且必须大于您的大小):

unsigned char r[100000];

unsigned char* newptr(unsigned char* p, int offset, int size) {
    memcpy(r, p + offset, size);
    r[size] = '\0';
    return r;
 }

使用静态本地缓冲区(与使用全局缓冲区的解决方案大致相同):

unsigned char* newptr(unsigned char* p, int offset, int size) {
    static unsigned char r[100000];        
    memcpy(r, p + offset, size);
    r[size] = '\0';
    return r;
}

使用输入变量的内存作为缓冲区(问题是函数调用后* p发生变化)

unsigned char* newptr(unsigned char* p, int offset, int size) {
    p[offset + size] = '\0';
    return p + offset;
}

将分配的缓冲区传递给函数:

unsigned char* newptr(unsigned char* p, int offset, int size, unsigned int* r) {
    memcpy(r, p + offset, size);
    r[size] = '\0';
    return r;
}