“使用指针将字符串从数组复制到数组”功能

时间:2014-01-11 06:00:47

标签: c arrays string pointers

我正在编写一个函数,应该使用指针

将字符串从数组复制到另一个数组
#include<stdio.h>

void copy_string(char *to,char *from);

void print_array(char *a);


int main(void)
{
    char *s1="Salahuddin";
    char *s2="Ashraf";

    print_array(s1);
    print_array(s2);

    copy_string(s1,s2);

    print_array(s1);
    print_array(s2);

return 0;
}

void print_array(char *a)
{
    while(*a!='\0')
        printf("%c",*a++);
    printf("\n");
}

void copy_string(char *to,char *from)
{
    while(*from != '\0')
    {
        *to++=*from++;
    }
}

但是当运行这段代码时,它只打印一次数组(在调用copy_string之前)函数,然后退出程序。

我试过调试它,发现当调用copy_string函数时,编译器去那里,检查* from!='\ 0'条件然后进入while循环,然后直接进入函数的末尾。

我无法弄清楚问题是什么?

任何人都可以帮忙吗?提前谢谢

3 个答案:

答案 0 :(得分:2)

char *s1="Salahuddin";
char *s2="Ashraf";

这个s1s2指向常量字符串实际上不是字符数组。而且他们的内容不应该改变。

将其更新为

char s1[20] ="Salahuddin";
char s2[20] ="Ashraf";

此处20只是随机数,您可能想要更改它。

同样在复制功能中,在字符串的末尾添加'\0'

void copy_string(char *to,char *from)
{
    while(*from != '\0')
    {
        *to++=*from++;
    }
    *to = '\0';
}

答案 1 :(得分:1)

这里最大的问题是s1s2指向文字字符串,这些是常量且只读。所以你不能在这里使用普通指针。

相反,你必须使用数组,例如

char s1[] = "some string";
char s2[] = "some other string";

您要做的第二件事是确保目标有足够的空间用于源字符串。在上面的示例中它不。通过使数组固定大小可以很容易地解决这个问题:

char s1[30] = "some string";
char s2[30] = "some other string";

答案 2 :(得分:0)

两件事:

  1. 你必须在你的目的地分配足够的存储空间,但你还没有,尽管在这种情况下两个字符串的长度恰好可以实现,但是
  2. 您正在修改非常糟糕的字符串文字(编译器实际上将它们存储在特殊的地方,或者至少可以存储,并且不支持写入存储它们的位置。)
  3. 如果你要更改字符串中的字符值,malloc()就是新的,你可以这样做(这也会确保你有足够的存储空间)。但是,你不能说

    char *foo = "blah";
    foo[0] = 'a'; /* WRONG */