C 不将字符复制到新数组中

C not copying characters into new array

我写了下面的代码来反转一个字符串:

#include <stdio.h>
#include <strings.h>
void reverse(char* str)
{
    int size = strlen(str)+1;
    printf("%d\n",size);
    char* rev = malloc(size*sizeof(char));
    int i,j;
    printf("Contents of rev as it is being filled: ");
    for(i=size, j=0 ; i>=0 ; i--, j++)
    {
        //printf("%c\n", str[i]);
        rev[j] = str[i];
        printf("%c", rev[j]);
    };
    printf("\n");
    printf("%s\n",str);
    printf("Result of trying to print rev after it has been made : %s\n",rev);
}

int main()
{
    reverse("Hello, World");

    return 0;
}

打印反转字符串的内容时,是正确的。但是,当我尝试在循环后打印 rev 时,我什么也得不到。这是什么时候发生的?

i = size 超出绑定数组访问权限。将其更改为 i = size-2 以跳过字符串末尾的 '[=13=]' 字符,并且您需要以 null 终止反转的字符串。

for(i=size-2, j=0 ; i>=0 ; i--, j++)
{
      //printf("%c\n", str[i]);
      rev[j] = str[i];
      printf("%c", rev[j]);
}
rev[j] = '[=10=]';

您正在反转包含空终止符的范围 [0, size]。所以 rev[0] 是空终止符,使其不打印任何内容。您需要反转范围 [0, size-1],然后将空终止符添加到末尾。 size 在这种情况下是 strlen(str) 而不是 strlen(str)+1

在您的程序中,您已将最后一个 '[=11=]' 复制为 rev 的第一个字符;结果,当您打印 rev 时,它什么也没显示。此外,您还必须在rev 的末尾添加空字符'\0'。那就是你的问题的解决方案。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void reverse(char* str)
{
    int size = strlen(str);
    printf("%d\n",size);
    char* rev = (char*)malloc(size*sizeof(char));
    int i,j;
    printf("Contents of rev as it is being filled: ");
    for(i=size-1, j=0 ; i>=0 ; i--, j++)
    {
        rev[j] = str[i];
        printf("%c", rev[j]);
    };
    rev[j] = '[=10=]';
    printf("\n");
    printf("%s\n",str);
    printf("Result of trying to print rev after it has been made : %s\n",rev);
}

这是我测试过的修改后的代码

void reverse(char* str)
{
    int size = strlen(str); //read 1. remove +1 here
    printf("%d\n",size);
    char* rev = malloc(size*sizeof(char) + 1); //read 2. add +1 here
    int i,j;
    printf("Contents of rev as it is being filled: ");
    for(i=size-1, j=0 ; i>=0 ; i--, j++) //read 3. gives -1 here
    {
        //printf("%c\n", str[i]);
        rev[j] = str[i];
        printf("%c", rev[j]);
    };
    rev[j] = '[=10=]'; //read 4. gives '[=10=]' at the end
    printf("\n");
    printf("%s\n",str);
    printf("Result of trying to print rev after it has been made : %s\n",rev);
}

有几点需要注意:

  1. strlen(str)(没有+1)应该足以声明字符串的大小。
  2. rev size,既然要用%s打印,就应该加1,这是加了'[=13=]'字符,这是打印字符串结束的标志。这就是 printf 使用 %s 的方式。
  3. 你要的是从str[size-1]开始;因为str size是size,所以offset应该比size小1。
  4. 仅为打印目的而完成。如果您不打印,则不需要此(以及 2.)。编辑:为了完整起见,请阅读 Jonathan Leffler 对此的评论,我自己觉得它很有帮助。

我电脑中的结果: