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

Copying elements from one character array to another

我想将元素从一个字符串转移到另一个字符串,因此编写了以下程序。最初,我认为 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]!='[=10=]'; i++)
    {
        temp[i] = str[i];
    }
    puts(temp);
    return 0;
}

void puts(const char *) 函数依赖于 size_t strlen(const char *),此函数的输出为 undefined when there is no null terminator in the passed argument (see this answer)。因此,在您的情况下,puts 中的 strlen 可能会在内存中找到一个 0 值 'next to',从而导致 puts 的正确行为,但情况并非总是如此因为它是未定义的。

当你声明 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;
}

这对我来说始终打印出不同的输出,尽管出于某种侥幸,它一直打印零部分。例如:

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)] 是侥幸, [=16=].

这是我电脑上的输入输出:

0
0
絯忐`

Process returned 0 (0x0)   execution time : 1.863 s
Press any key to continue.

看到垃圾“絯忐`”了吗?这是未定义的行为。你的程序运行良好,因为你 (un)lucky.

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