循环中的意外情况

时间:2017-01-15 20:08:20

标签: c

#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

我无法理解为什么会发生这种情况。我认为当string2string4到达&#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就可以了无法看到数字?

3 个答案:

答案 0 :(得分:2)

我期望的实际输出是:

string1 = Hello
string3 = Good Bye

两个函数分别使用索引表示法和指针推送实现strcpy()的复制部分。它们都将字符从源(第二个参数)复制到目标(第一个参数),直到并包括空终止符。评估测试实际上会复制字符:复制空终止符并停止循环。

其他目标数组string1string3仍然未初始化。它们不包含任何精确的内容:这些数组分配在自动存储(在堆栈上的 )并且初始化。我不知道你从哪里得到这个数组初始内容的概念,可能来自一些使用这个内容初始化数组的示例程序,但默认情况下没有这样的事情发生。

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");