首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么打印字符串时会显示不想要的字符?

为什么打印字符串时会显示不想要的字符?
EN

Stack Overflow用户
提问于 2022-11-11 15:17:23
回答 3查看 53关注 0票数 1
代码语言:javascript
复制
#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上,但不在在线编译器上,在线编译器工作正常,有人能告诉我原因吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-11-11 16:09:21

这个循环

代码语言:javascript
复制
for (int i = 0; main[i] !='\0' ; i++)
{
    copy[i]=main[i];
}

不复制存储在数组'\0'中的数组main中的源字符串的终止零字符copy

因此,数组copy不包含字符串。但是,转换规范%s需要一个相应的参数,即指向字符串的指针。因此,printf的这个调用

代码语言:javascript
复制
printf("%s",copy);

调用未定义的行为。

解决这个问题有几种方法。

例如,您可以首先零初始化数组copy,如下所示

代码语言:javascript
复制
`char copy[30] = ""`;

另一种方法是复制目标数组中终止的零字符'\0',例如

代码语言:javascript
复制
for ( int i = 0; ( cooy[i] = main[i] ) !='\0' ; i++);

或者,您可以输出数组,例如,在printf调用中指定精度字段

代码语言:javascript
复制
int i = 0;
for ( ; main[i] !='\0' ; i++ )
{
    copy[i] = main[i];
}
printf( "%.*s\n", i, copy );

注意,与手工编写的for循环不同,您可以使用标头strcpy中声明的标准函数<string.h>,如下所示

代码语言:javascript
复制
#include <string.h>

//...

puts( strcpy( copy, main ) );
票数 0
EN

Stack Overflow用户

发布于 2022-11-11 15:36:48

有时,“未定义的行为”意味着它似乎有效。您可以初始化copy,也可以简单地复制NUL:

代码语言:javascript
复制
i = 0;
do  {
    copy[i] = main[i];
    } while (main[i++]);
票数 1
EN

Stack Overflow用户

发布于 2022-11-11 15:27:04

printf函数期望以空结尾的字符串打印。否则,您的程序可能会访问您不想访问的额外字节字符串。这取决于环境和编译器如何对这种情况作出反应,但通常情况下,它是未定义的行为。您应该使字符串的最后一个符号等于'\0'来修复它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74404584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档