将元素从一个字符数组复制到另一个字符数组

时间:2016-02-20 12:55:28

标签: c arrays string null copying

我想将字符串中的元素转移到另一个字符串,因此编写了以下程序。最初,我认为for循环应该执行,直到复制了NULL字符(包括它)。但是在这段代码中,如果找到一个NULL字符(即尚未复制),for循环终止,但它仍然能够显示已复制元素的字符串。如果首先没有NULL字符,这怎么可能?

#include<stdio.h>
#include<stdlib.h>

int main()
{
    char temp[100], str[100];
    fgets(str, 100, stdin);
    int i;
    for(i = 0; str[i]!='\0'; i++)
    {
        temp[i] = str[i];
    }
    puts(temp);
    return 0;
}

3 个答案:

答案 0 :(得分:7)

void puts(const char *)函数依赖于size_t strlen(const char *),并且当传递的参数中没有空终止符时,此函数的输出为undefined(请参阅this answer)。所以在你的情况下strlen里面的puts可能在内存中找到了一个0'值',导致puts的正确行为,但是并不总是这样。这是未定义的。

答案 1 :(得分:7)

以下是我计算机上的输入和输出:

<!DOCTYPE html>
<html>
<head>
</head>
<body>

<div class="a">
  <div class="b">test</div>

</div>

</body>
</html>

看垃圾“絯忐`”?这是未定义的行为。您的计划效果很好,因为您(非)幸运

同样,未定义的行为不值得讨论。

答案 2 :(得分:3)

当您声明char temp[100]而没有将其初始化为任何内容时,它只需要未初始化的内存。这个记忆可以是任何东西。例如,以下程序将以整数形式写出其初始内容:

#include<stdio.h>
#include<stdlib.h>

int main()
{
    char temp[100];
    int i;
    for(i = 0; i < 100 ; i++)
    {
        fprintf(stdout, "%d ", temp[i]);
    }
    return 0;
}

这为我打印出不同的输出,但是通过一些侥幸它会保持打印零的部分。 e.g:

88 -70 43 81 -1 127 0 0 88 -70 43 81 -1 127 0 0 1 0 0 0 0 0 0 0 112 -70 43 81 -1 127 0 0 0 64 -108 14 1 0 0 0 72 50 -13 110 -1 127 0 0 -128 -70 43 81 -1 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 96 -70 43 81

88 90 72 88 -1 127 0 0 88 90 72 88 -1 127 0 0 1 0 0 0 0 0 0 0 112 90 72 88 -1 127 0 0 0 -96 119 7 1 0 0 0 72 18 72 105 -1 127 0 0 -128 90 72 88 -1 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 96 90 72 88

88 -6 -79 87 -1 127 0 0 88 -6 -79 87 -1 127 0 0 1 0 0 0 0 0 0 0 112 -6 -79 87 -1 127 0 0 0 0 14 8 1 0 0 0 72 34 57 104 -1 127 0 0 -128 -6 -79 87 -1 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 96 -6 -79 87

最有可能发生的事情是你的非空终止字符串被意外空终止,因为temp[strlen(str)]是侥幸, \0