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);
}
有几点需要注意:
strlen(str)
(没有+1)应该足以声明字符串的大小。
- rev size,既然要用
%s
打印,就应该加1,这是加了'[=13=]'
字符,这是打印字符串结束的标志。这就是 printf
使用 %s
的方式。
- 你要的是从
str[size-1]
开始;因为str size是size,所以offset应该比size小1。
- 仅为打印目的而完成。如果您不打印,则不需要此(以及 2.)。编辑:为了完整起见,请阅读 Jonathan Leffler 对此的评论,我自己觉得它很有帮助。
我电脑中的结果:
我写了下面的代码来反转一个字符串:
#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);
}
有几点需要注意:
strlen(str)
(没有+1)应该足以声明字符串的大小。- rev size,既然要用
%s
打印,就应该加1,这是加了'[=13=]'
字符,这是打印字符串结束的标志。这就是printf
使用%s
的方式。 - 你要的是从
str[size-1]
开始;因为str size是size,所以offset应该比size小1。 - 仅为打印目的而完成。如果您不打印,则不需要此(以及 2.)。编辑:为了完整起见,请阅读 Jonathan Leffler 对此的评论,我自己觉得它很有帮助。
我电脑中的结果: