#include <stdio.h>
void copy1(char *s1, const char *s2) {
int i;
for (i = 0; (s1[i] = s2[i]) != '\0'; i++)
;
}
void copy2(char *s1, const char *s2) {
for ( ; (*s1 = *s2) != '\0'; s1++, s2++)
;
}
int main() {
char string1[10];
char *string2 = "Hello";
char string3[10];
char string4[] = "Good Bye";
copy1(string1, string2);
printf("string1 = %s\n", string1);
copy2(string3, string4);
printf("string3 = %s\n", string3);
return 0;
}
我有这样的代码,但我预计它应该打印出来:
Hello56789
Good Bye89
但它只产生了:
Hello Good Bye
我无法理解为什么会发生这种情况。我认为当string2
和string4
到达&#39; \ 0&#39;时,循环将会停止。如果发生这种情况,为什么我看不到数组中剩余的数字(56789 ..)?
我的意思是Hello的长度为5.当发生这种情况时:for ( i = 0; ( s1[ i ] = s2[ i ] ) != '\0'; i++ )
在Hello的第5个元素之后,\ 0来了,循环结束了。所以,数组的元素是0,1 ,2,3,4取代了Hello的字母。但是,仍然有5,6,7,8,9在string1中没有被替换。我们用%s打印string1就可以了无法看到数字?
答案 0 :(得分:2)
我期望的实际输出是:
string1 = Hello
string3 = Good Bye
两个函数分别使用索引表示法和指针推送实现strcpy()
的复制部分。它们都将字符从源(第二个参数)复制到目标(第一个参数),直到并包括空终止符。评估测试实际上会复制字符:复制空终止符并停止循环。
其他目标数组string1
和string3
仍然未初始化。它们不包含任何精确的内容:这些数组分配在自动存储(在堆栈上的 )并且不初始化。我不知道你从哪里得到这个数组初始内容的概念,可能来自一些使用这个内容初始化数组的示例程序,但默认情况下没有这样的事情发生。
printf()
输出数组string1
的内容作为%s
格式的参数,被认为是C字符串,并在到达空终止符时停止。
答案 1 :(得分:0)
循环退出条件是空字符(\0
)。在字符串的末尾可以看到此字符。
没有来源的数字字符,因此它们不是
答案 2 :(得分:0)
在使用复制函数之前,必须使用0..9初始化string1和string3,但在init之前,必须将string1和string3的字段长度从10扩展到11(添加\ 0 char):
strcpy(string1,"0123456789");
strcpy(string3,"0123456789");