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

时间:2015-12-19 15:25:27

标签: c reverse

我编写了以下代码来反转字符串:

#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;
}

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

3 个答案:

答案 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);
    }
}

有些事情需要注意:

  1. 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)应足以声明字符串的大小。
  2. rev size,因为要使用strlen(str)打印它,应该增加1,这是添加%s字符,这是终止打印字符串的指示符。这就是'\0'使用printf的方式。
  3. 你想要的是从%s开始;因为str大小是大小,所以偏移应该比大小小一个。
  4. 仅用于打印。如果不打印,则不需要此(以及2.)。编辑:完整性&#39;此刻,请阅读Jonathan Leffler对此的评论,我自己觉得它很有帮助。
  5. 我的电脑上的结果:

    enter image description here

答案 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);
}