吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 588|回复: 6
收起左侧

[求助] c语言字符串的问题

[复制链接]
lovnie 发表于 2021-12-3 17:46
本帖最后由 lovnie 于 2021-12-6 09:02 编辑

[C] 纯文本查看 复制代码
char str[] = {'a', 'b', 'c', 'd'};
        for ( unsigned int i = 0; i < sizeof(str); i++) {
                printf("%c\n",str[i]);
        }

        printf("%s\n", str);


[C] 纯文本查看 复制代码
char str[] = {'a', 'b', 'c', 'd'};
printf("%s\n", str);


循环之后和不循环显示为什么还不一样

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

heimaojingzhang 发表于 2021-12-3 18:02
为什么不一样?我试了一遍是一样的啊
[C++] 纯文本查看 复制代码
#include<iostream>
using namespace std;
int main(void)
{
	char str[] = {'a', 'b', 'c', 'd'};
    for ( unsigned int i = 0; i < sizeof(str); i++) {
        printf("%c\n",str[i]);
    }
 
    printf("循环后:%s\n", str);
	
	
	char str1[] = {'a', 'b', 'c', 'd'};
	printf("不循环:%s\n", str1);


	return 0;
}


结果:
[Asm] 纯文本查看 复制代码
a
b
c
d
循环后:abcd
不循环:abcd

--------------------------------
Process exited after 0.0354 seconds with return value 0
请按任意键继续. . .
detewhkn 发表于 2021-12-3 19:33
确实不一样,估计和编译器有关系。我试了下在线的C语言编译器,在https://c.runboo.com/complie/11,下面的会显示abcdabcd,循环的只显示abcd。而在https://www.dotcpp.com/run/中,两者显示的就一样。和32位、64位没什么关系,两个都是64位的。
无闻无问 发表于 2021-12-3 21:59
看运气吧,没有\0结尾,啥情况都可能…

免费评分

参与人数 1吾爱币 +1 收起 理由
liyitong + 1 我很赞同!

查看全部评分

无闻无问 发表于 2021-12-3 22:29
3楼为什么是abcdabcd,因为没加\0,加个%p打印地址,一一目了然…

0x7ffd065ede08 a
0x7ffd065ede09 b
0x7ffd065ede0a c
0x7ffd065ede0b d
循环后:0x7ffd065ede08 abcd
不循环:0x7ffd065ede04 abcdabcd

免费评分

参与人数 1热心值 +1 收起 理由
liyitong + 1 直接把下个字符串也给打印了

查看全部评分

DEATHTOUCH 发表于 2021-12-4 00:32
你不说你的编译环境我只能猜测是编译器的问题了,我用mingw-gcc试了循环与否结果是一样的
liyitong 发表于 2021-12-4 07:52
本帖最后由 liyitong 于 2021-12-4 07:58 编辑

[C++] 纯文本查看 复制代码
#include<iostream>
using namespace std;
int main(void)
{
    char str[] = {'a', 'b', 'c', 'd','\0'};
        //char str[]={"abcd"};
    for ( unsigned int i = 0; i < sizeof(str); i++) {
        printf("%c\n",str[i]);
    }
  
    printf("循环后:%s\n", str);
     
     
    char str1[] = {'a', 'b', 'c', 'd','\0'};
        //char str1[]={"abcd"};
    printf("不循环:%s\n", str1);
 
 
    return 0;
}
执行结果:
a
b
c
d

循环后:abcd
不循环:abcd
Press any key to continue

主要原因在于,c语言中并没有字符串这个类型,而是字符数组配合结束标记,组合出来的一种表达方式。
有些编译器会自动优化补充结束符,而有些编译器不会——
所以不写结束符的话,就可能会出现一些随机乱码。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
lovnie + 1 + 1 我很赞同!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-25 18:50

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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