我编写了以下代码来反转字符串:
#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;
}
打印反转字符串的内容时,它们是正确的。但是,当我尝试在循环后打印转速时,我什么也得不到。这是什么时候发生的?
答案 0 :(得分:3)
i = size
超出绑定数组访问权限。将其更改为i = size-2
以跳过字符串末尾的'\0'
字符,您需要将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] = '\0';
答案 1 :(得分:3)
以下是我测试为工作的修改后的代码
public class Test1 {
public static void changeStr(String str){
str="welcome";
}
public static void main(String[] args) {
String str="1234";
changeStr(str);
System.out.println(str);
}
}
有些事情需要注意:
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] = '\0'; //read 4. gives '\0' 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,这是添加%s
字符,这是终止打印字符串的指示符。这就是'\0'
使用printf
的方式。%s
开始;因为str大小是大小,所以偏移应该比大小小一个。我的电脑上的结果:
答案 2 :(得分:-1)
在您的计划中,您已将最后'\0'
复制为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] = '\0';
printf("\n");
printf("%s\n",str);
printf("Result of trying to print rev after it has been made : %s\n",rev);
}