【问题标题】:Issue with copying over strings when implementing strrchr in C在 C 中实现 strrcr 时复制字符串的问题
【发布时间】:2015-01-22 08:42:35
【问题描述】:

对于家庭作业,我必须在 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,因为它会跳过最初的“H”。但是,它会打印出HHdefHello World

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

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

【问题讨论】:

  • 不返回副本,只返回指针
  • strrchr 的文档说 “返回指向 C 字符串 str 中最后出现的字符的指针”。它没有说明复制任何内容,所以我不确定你函数中的最后一个循环是 for(?)。
  • @Michael 你是对的,我没有仔细阅读它。抱歉,我把这个方法弄得比它应该做的更复杂。

标签: c string pointers


【解决方案1】:

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

未初始化的局部(非静态)变量的值是不确定的,实际上看起来是随机的。这意味着你不知道result 指向哪里。取消引用并添加到它是导致未定义行为的原因。

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

【讨论】:

  • 我将如何初始化它?当我试图只做char result[250] 时,编译器警告我返回局部变量。有什么我应该做的吗?编辑:我现在会阅读更多关于它的信息,谢谢。
  • @Alex 解决方案实际上比您想象的要简单得多。提示:循环向后
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
相关资源
最近更新 更多