鱼C论坛

 找回密码
 立即注册
查看: 1135|回复: 4

[已解决]关于字符串

[复制链接]
发表于 2020-8-6 05:00:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
# include <stdio.h>
# include <string.h>

int main(void)
{
        char str1[] = "To be or not to be";
        char str2[40];
       
        strncpy(str2, str1,5);
        str2[5] = '\n';

        printf("1:%s\n", str1);
        printf("2:%s\n", str2);

        return 0;
}


运行后显示:
1:To be or not to be
2:To be
烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫To be or not to be
请按任意键继续. . .


一堆烫是啥意思,编译器是VS2013;

微信图片_20200806045830.png

最佳答案
2020-8-6 17:01:26
我的电脑里也是烫。因为它就是烫。你的数组2未赋完值,所以后面的值都是默认值。内存里存的都是烫。字符串结束符是'\0'。你那个函数只是粘贴过去,并没有让str2结束。所以它把40个字符,不,39个字符打完,第40个应该默认0的。不过看情况,好像不是的,好像没有,所以打完40个字符后,继续打下去了,直接为0。而str2后面接着就是str1,所以,一直打到str1结束。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-6 06:49:22 | 显示全部楼层
本帖最后由 baige 于 2020-8-6 08:01 编辑

str2你把结束‘\0’写成'\n',str2'\n'之后涉及到“未初始化的变量,它的值不确定”。有时运行一个别的程序后,再来运行这个程序,它的结果就有可能不相同了。
dev会帮你把字符数组初始化为‘\0’,VS则不会
# include <stdio.h>
# include <string.h>

int main(void)
{
        char str1[] = "To be or not to be";
        char str2[40];
        strncpy(str2, str1,5);
        str2[5] = '\0';

        printf("1:%s\n", str1);
        printf("2:%s\n", str2);

        return 0;
}


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-6 09:23:34 | 显示全部楼层
strncpy 不会自动添加 '\0' 结束符,所以你应该手动添加 '\0',而不是 '\n' 。正确代码如下:
#include<stdio.h>
#include<string.h>

int main() {
    char str1[] = "To be or not to be";
    char str2[40];
    strncpy(str2, str1, 5);
    str2[5] = '\0';

    printf("1:%s\n", str1);
    printf("2:%s\n", str2);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-6 10:41:36 | 显示全部楼层
本帖最后由 livcui 于 2020-8-6 10:43 编辑

改为:
# include <stdio.h>
# include <string.h>

int main(void)
{
    char str1[] = "To be or not to be";
    char str2[40];

    strncpy(str2, str1, 5);
    str2[5] = '\n';
    str2[6] = '\0';

    printf("1:%s\n", str1);
    printf("2:%s\n", str2);

    return 0;
}

因为 strncpy() 不会在字符串 str2 结尾添加 '\0', print 打印字符串到 \0 截止,但 str2 结尾没有 \0 ,print 就会一直读取下面的内存块,但内存块里什么也没有,就打印了一堆 烫烫烫烫烫烫烫烫....

但 \0 在内存里很常见,所以遇到内存中的 \0 还是会停止打印 烫烫烫烫烫...

在字符串结尾加一个 '\0' 即可


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-6 17:01:26 | 显示全部楼层    本楼为最佳答案   
我的电脑里也是烫。因为它就是烫。你的数组2未赋完值,所以后面的值都是默认值。内存里存的都是烫。字符串结束符是'\0'。你那个函数只是粘贴过去,并没有让str2结束。所以它把40个字符,不,39个字符打完,第40个应该默认0的。不过看情况,好像不是的,好像没有,所以打完40个字符后,继续打下去了,直接为0。而str2后面接着就是str1,所以,一直打到str1结束。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 07:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表