你能解释一下这个C程序的输出吗?

时间:2017-01-23 23:59:57

标签: c

#include <stdio.h>
#include <string.h>

main() {
    int i = 0, j = 0;
    char ch[] = { "chicken is good" };
    char str[100];
    while ((str[i++] = ch[j++]) != '\0') {
        if (i == strlen(str))
            break;
    }
    printf("%s", str);
}

我想使用"chicken is good"循环将字符串chstr复制到while。但是当我打印str时,输出会显示"chi"。它只打印部分字符串。我的病情错了吗?

我使用Dev c ++作为我的IDE,我的编译器版本是gcc 4.9.2。而且我也是编程新手。

2 个答案:

答案 0 :(得分:3)

语句if (i == strlen(str)) break;没用,并且由于str尚未终止,因此行为未定义。

请注意,您的程序还有其他问题:

  • 您必须将main函数的返回值指定为int。您使用的是过时的语法。
  • 源和目标数组不需要单独的索引变量ij。它们总是具有相同的价值。
  • 您应该在邮件末尾打印换行符。
  • 为了获得好的风格,您应该在0的末尾返回main()

这是一个更简单的版本:

#include <stdio.h>

int main(void) {
    int i;
    char ch[] = "chicken is good";
    char str[100];

    for (i = 0; (str[i] = ch[i]) != '\0'; i++) {
        continue;
    }
    printf("%s\n", str);
    return 0;
}

答案 1 :(得分:2)

strlen(str)有未定义的行为,因为它正在读取未初始化的值。