在C中实现strrchr时复制字符串的问题

时间:2015-01-22 08:42:36

标签: c string pointers

对于家庭作业,我必须在string.h中实现22个函数。我正在努力实现strrchr,但在尝试复制生成的匹配字符串时遇到了一些问题。

以下是我目前的实施尝试:

char *new_strrchr(const char *str, int c) {
    const char *str_copy = str;
    int i, index = -1;
    char *result;
    for(i = 0; *str_copy != '\0'; ++str_copy, ++i){
        if(*str_copy == c) {
            index = i;
        }
    }
    if(index == -1) {
        return NULL;
    }
    while(index < strlen(str))
    {
        *result = str[index];
        result++;
        index++;
    }
    return result;
}

出于某种原因,result有一些奇怪的行为。我将以一个例子来说明。

char str1[] = "abcHdefHello World";
char search = 'H';
char *result;
result = new_strrchr(str1, search);
printf("Result: %s\n", result);

这应打印出Hello World,因为它会跳过最初的&#39; H&#39;。但是,它会打印出HHdefHello World

最初,我认为这与我如何实现实际算法以找到最后一个字符有关,但当我printf("%c",str[index]);时,在while循环中,我的输出结束了为Hello World。所以,我可以肯定地说我是在正确的索引,我正在输出正确的字符。

我想这与result有关,但我不知道它可能是什么。我甚至尝试使用*result = 0在最后添加一个空字符,但最终只是删除了整个字符串。

1 个答案:

答案 0 :(得分:4)

您的代码中有undefined behavior:变量result未初始化但您已使用它。

未初始化的本地(非静态)变量的值是 indeterminate ,实际上看似随机。这意味着你不知道result指向哪里。解除引用并添加它是导致未定义行为的原因。

我认为你需要read more about the actual strrchr function,因为它不会复制,只是返回指向传递的字符串中最后一个匹配字符的指针。