将元素从一个字符数组复制到另一个
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.
同样,未定义的行为不值得太多讨论。
我想将元素从一个字符串转移到另一个字符串,因此编写了以下程序。最初,我认为 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.
同样,未定义的行为不值得太多讨论。