在 C 中实现 strrchr 时复制字符串的问题
Issue with copying over strings when implementing strrchr in C
对于家庭作业,我必须在 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 != '[=10=]'; ++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
在末尾添加一个空字符,但最终只是删除了整个字符串。
您的代码中有 undefined behavior:变量 result
未初始化,但您使用了它。
未初始化的局部(非静态)变量的值是 不确定的,实际上看起来是随机的。这意味着您不知道 result
指向何处。取消引用并添加到它是导致未定义行为的原因。
我认为您需要 read more about the actual strrchr
function 因为它不会制作副本,而只是 returns 指向传递的字符串中最后一个匹配字符的指针。
对于家庭作业,我必须在 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 != '[=10=]'; ++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
在末尾添加一个空字符,但最终只是删除了整个字符串。
您的代码中有 undefined behavior:变量 result
未初始化,但您使用了它。
未初始化的局部(非静态)变量的值是 不确定的,实际上看起来是随机的。这意味着您不知道 result
指向何处。取消引用并添加到它是导致未定义行为的原因。
我认为您需要 read more about the actual strrchr
function 因为它不会制作副本,而只是 returns 指向传递的字符串中最后一个匹配字符的指针。