用指针堆叠溢出 C 副本字符串



我正在用 c 编写一个递归复制字符串函数,并且收到写入访问冲突。当函数到达字符串中的最后一个字母时,函数不会终止。

代码如下:

#include <stdio.h>
void copy(char*, char*, int);
int main()
{
    char str1[10] = { 'H', 'e', ' j',' h','e', 'j' };
    char str2[10] = { '/0' };
    copy(str1, str2, 0);
    printf(str2);
    getchar();
    return 0;
}
void copy(char* str1, char* str2, int index) {
    while (str1[index] != '/0') {
        str2[index] = str1[index];
        index++;
        copy(str1, str2, index);
    }
    return;
}

你有几个问题。

1( (空字节(与/0不同。C 字符串以 (或仅 0(结尾,这肯定是您打算使用的。

2( 您在' j'' h'中有空格 - 这些是多字节字符。同样,这可能不是您想要的。如果您打算在字符之间留出空格,然后,您需要:

char str1[] = { 'H', 'e', ' ', 'j',' ', 'h','e', 'j' };

char str1[] = "He j h ej";

如果没有,请从数组的这两个元素中删除空格str1。你可以把它写成:

char str1[] = "Hejhej";

此外,最好(不易出错(省略数组维度 - 编译器将分配足够的空间。如果您需要知道数组的大小,则可以使用sizeof str1来获取它。

您的copy函数根本不需要index。由于要递归复制,因此使用 while 循环也是不正确的。所以你可以把它写成:

#include <stdio.h>
void copy(const char*, char*);
int main(void)
{
    char str1[] = "Hejhej";
    /* Equivalent to:
     * char str1[] = { 'H', 'e', 'j', 'h', 'e', 'j', '' }; 
     */
    char str2[sizeof str1] = { '' };
    copy(str1, str2);
    printf("%sn", str2);
    return 0;
}
void copy(const char *str1, char *str2)
{
    if (*str1) {
        *str2 = *str1;
        copy(++str1, ++str2);
    } else {
        /* This isn't strictly needed because the destination string `str2` contains null bytes. */
        *str2 = '';
    }
}

这里有三个主要问题:

1(你在应该''的时候使用'/0'

2(初始值设定项中有多余的空格,即 ' j'' h'.

3(你的递归函数并没有真正做你想要的 - 不要使用while。它应该只复制一个字符,然后执行递归调用,直到它遇到''

代码应该看起来像这样:

#include <stdio.h>
void copy(char*, char*, int);
int main()
{
    char str1[10] = { 'H', 'e', 'j','h','e', 'j' };
                         //     ^^   ^^ removed extra spce
    char str2[10];  // No initialization needed
    copy(str1, str2, 0);
    printf(str2);
    getchar();
    return 0;
}
void copy(char* str1, char* str2, int index) {
    str2[index] = str1[index];
    // Have we reached end?
    if (str1[index] != '') {
        // No - so call again
        index++;
        copy(str1, str2, index);
    }
    return;
}

相关内容

  • 没有找到相关文章

最新更新