字符串中,\0怎么复制?

将字符数组s2中的字符全部复制到s1中,不用strcpy函数。复制时,‘\0’也要复制过去,‘\0’后面的字符不复制。

#include<stdio.h>
#define N 80
main()
{
    char s1[N] , s2[N] ;
    int i ;
    s1[N]={'\0'};
    printf("input s2:");
    gets(s2);
    for( i=0 ; s1[i] != '\0' ; i++ ){
        s1[i]=s2[i];        
    }
    printf("s1:%s\n",s1);
} 

下面是书上的答案

#include<stdio.h>
#include<string.h> 
#define N 80
main()
{
    char s1[N] , s2[N] ;
    int i ;
    printf("input s2:");
    gets(s2);
    for( i=0 ; i <= strlen(s2) ; i++ ){
        s1[i]=s2[i];        
    }
    printf("s1:%s\n",s1);
} 

我有两个疑虑:
1.strlen是求字符串长度函数,我可以换成sizeof吗?
2.他的方法也没有输出'\0'吧?

    for( i=0 ; s1[i] != '\0' ; i++ ){
        s1[i]=s2[i];        
    }
        s1[i] = s2[i]; //或者s1[i] = '\0';

1.strlen是求字符串长度函数,我可以换成sizeof吗?

答:在书上的答案这个例子里面不可以的,因为书上用的是 i <= strlen(s2),已经将整个数字符串的数据,包含\0都复制到 s1[i]数组中去了,如果
非得要替换成 i <= sizeof(s2)的话,会导致将s2的字符串中\0后面的一个字节字节也复制到s1中去了,如果你非要用sizeof(s2)替换的话,这里有几个问题
1.必须将for( i=0 ; i <= sizeof(s2) ; i++ )的i <= sizeof(s2)改成i < sizeof(s2)
2.不管你输入的字符长度数多少,sizeof(s2)都是固定的80个字节,也就for( i=0 ; i <=sizeof(s2);i++)每次都是固定循环80次,和你输入的字符串没关系。
3.sizeof(s2),只能当s2是数组时才可以得出数组的长度,如果s2是指针而不是数组,sizeof(s2)就是int类型的长度了,也就是只有4个字节

2.他的方法也没有输出'\0'吧?

**答 **他的方法中有输出'\0'的,因为他用的是 i <= sizeof(s2),注意多了'='号,下标从0开始的,这样就刚好多复制比 sizeof(s2)多一个字节的数据,这个多的
数据就刚好是s2的'\0'

3.你自己的代码里面的问题:

答:s1[N]={'\0'};写法错误,要么你在初始化时写成char s1[N]={'a'}; ,否则你不能这样写,而且就算按照你的代码写的,你要初始化
也不初始化为0,如果你全部初始化成0,你的for语句就进不去了,你只要初始化成其他的值,你的代码就是正常的

1.C库的字符串操作函数都是以自动识别0为结尾的,赋值拷贝时需要注意边界即可。
2.sizeof对于指针和数组要区分,对于简单类型和结构体那是很方便的。
最后就是以上两点你自己运行一下就晓得了(书本上的代码很多都存在问题),你的预期和运行结果不一致时才需要提出来疑问。