#include<stdio.h>
int main()
{
char main[]="Structured Programming";
char copy[30];
for (int i = 0; main[i] !='\0' ; i++)
{
copy[i]=main[i];
}
printf("%s",copy);
}在上面的问题中,这只是应该打印Structured Programming,但我得到了Structured Programming a,这发生在所有ide上,但不在在线编译器上,在线编译器工作正常,有人能告诉我原因吗?
发布于 2022-11-11 16:09:21
这个循环
for (int i = 0; main[i] !='\0' ; i++)
{
copy[i]=main[i];
}不复制存储在数组'\0'中的数组main中的源字符串的终止零字符copy。
因此,数组copy不包含字符串。但是,转换规范%s需要一个相应的参数,即指向字符串的指针。因此,printf的这个调用
printf("%s",copy);调用未定义的行为。
解决这个问题有几种方法。
例如,您可以首先零初始化数组copy,如下所示
`char copy[30] = ""`;另一种方法是复制目标数组中终止的零字符'\0',例如
for ( int i = 0; ( cooy[i] = main[i] ) !='\0' ; i++);或者,您可以输出数组,例如,在printf调用中指定精度字段
int i = 0;
for ( ; main[i] !='\0' ; i++ )
{
copy[i] = main[i];
}
printf( "%.*s\n", i, copy );注意,与手工编写的for循环不同,您可以使用标头strcpy中声明的标准函数<string.h>,如下所示
#include <string.h>
//...
puts( strcpy( copy, main ) );发布于 2022-11-11 15:36:48
有时,“未定义的行为”意味着它似乎有效。您可以初始化copy,也可以简单地复制NUL:
i = 0;
do {
copy[i] = main[i];
} while (main[i++]);发布于 2022-11-11 15:27:04
printf函数期望以空结尾的字符串打印。否则,您的程序可能会访问您不想访问的额外字节字符串。这取决于环境和编译器如何对这种情况作出反应,但通常情况下,它是未定义的行为。您应该使字符串的最后一个符号等于'\0'来修复它。
https://stackoverflow.com/questions/74404584
复制相似问题