-1

我试图使用指针将字符串的一部分复制到另一个字符串。我生成的字符串开始在正确的位置复制,尽管它在超过计数后并没有停止。此外,字符串不是从源字符串而不是从结果参数复制的

#include <stdio.h>

char *getSub(const char *orig, int start, int count, char *res);

int main(void)
{
    const char orig[] = "one two three";
    char res[] = "123456789012345678";

    printf("%s\n",getSub(orig, 4, 3, res));

    return 0;
}

char *getSub(const char *orig, int start, int count, char *res)
{    
    const char *sCopy = orig;

    while (*orig)
    {
        if (start >= (orig - sCopy)) && (res-sCopy < count))
        {
            *res++ = *orig++;
        }
        else
            *orig++;
    }

    return res;
}
4

3 回答 3

1

最大的错误是您正在计算两个不相关指针的差异res - sCopy(我想sourceCopy也在sCopy实际代码中,或者相反)。仅当两个指针都指向(或超过末尾)同一个数组时,计算指针的差异才有意义。如所写,是否有任何东西被复制取决于两个数组的任意位置。

        if (start >= (orig - sourceCopy)) && (res-sCopy < c))
        {
            *res++ = *orig++;
        }
        else
            *orig++;

无论如何,这不计算复制了多少个字符(如果有的话)。

另一个错误是您没有 0 终止副本。

一个正确的实现是

char *getSub(const char *orig, int start, int count, char *res)
{
    char *from = orig, *to = res;
    // check whether the starting position is within orig
    for( ; start > 0; --start, ++from)
    {
        if (*from == 0)
        {
             res[0] = 0;
             return res;
        }
    }
    // copy up to count characters from from to to
    for( ; count > 0 && *from; --count)
    {
        *to++ = *from++;
    }
    // 0-terminate
    *to = 0;
    // return start of copy, change to return to if end should be returned
    return res;
}
于 2012-07-29T23:23:30.493 回答
0
#include <string.h>

char *getSub(const char *orig, int start, int count, char *res){
    int i,j,len = strlen(orig), limit = start + count;

    if(res == NULL) return NULL;
    if(start >= len || start < 0 || orig == NULL){
        *res = '\0';
        return res;
    }
    for(j=0,i=start;i<len && i < limit;++i){
        res[j++]=orig[i];
    }
    res[j]='\0';
    return res;
}
于 2012-07-31T12:21:14.180 回答
0

您的代码至少有两个问题。

  1. res - sCopy没有意义,因为它们指向不同的对象。
  2. 您尚未对目标字符串进行空终止。
于 2012-07-29T23:16:23.493 回答