标题:老师给的题目不是很会
只看楼主
Xovery
Rank: 2
等 级:论坛游民
帖 子:29
专家分:14
注 册:2022-10-22
结帖率:66.67%
已结贴  问题点数:5 回复次数:11 
老师给的题目不是很会
程序代码:
#include <stdio.h>
#include <string.h>
int main()
{
    short a[] = { -1, 257, 123, 62, 91, 18, 44, 73, 0, 26 };
    short* p = &a[1], * q = a + 5;
    short x = *++p, y = *(q + 1);
    char* str = (char*)a; short z = strlen(str);
}
搜索更多相关主题的帖子: short 老师 str include char 
2023-01-30 15:29
Xovery
Rank: 2
等 级:论坛游民
帖 子:29
专家分:14
注 册:2022-10-22
得分:0 
为什么最后  z=5 啊
2023-01-30 15:29
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:1 
先去除不相干的代码,变为
程序代码:
#include <stdio.h>
#include <string.h>

int main( void )
{
    short a[] = { -1, 257, 123, 62, 91, 18, 44, 73, 0, 26 };
    size_t z = strlen( (char*)a );
    printf( "%zu\n", z );
}


简而言之,就是把「short数组」当成「空字符结尾的字符串」看待,计算其字符串长度

如果系统是 big-endian,那么
short a[] = { -1, 257, 123, 62, 91, 18, 44, 73, 0, 26 };
它在内存中的字节排布就是 0xFF 0xFF 0x01 0x01 0x00 0x7B 0x00 0x3E ……
所以 strlen( (char*)a ) 返回 4

如果系统是 little-endian,那么
short a[] = { -1, 257, 123, 62, 91, 18, 44, 73, 0, 26 };
它在内存中的字节排布就是 0xFF 0xFF 0x01 0x01 0x7B 0x00 0x3E 0x00 ……
所以 strlen( (char*)a ) 返回 5

[此贴子已经被作者于2023-1-30 16:10编辑过]

2023-01-30 15:47
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:1 
-1, 257, 123 内码 ff ff 01 01 7b 00
2023-01-30 15:47
Xovery
Rank: 2
等 级:论坛游民
帖 子:29
专家分:14
注 册:2022-10-22
得分:0 
我查内存了
为什么123是7b 00啊
2023-01-30 16:04
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 5楼 Xovery
那你认为应该是什么?你不说出来,别人没法回答呀
2023-01-30 16:20
billliu66
Rank: 1
等 级:新手上路
威 望:1
帖 子:4
专家分:4
注 册:2020-3-5
得分:1 
strlen()函数是用来获取字符串长度的,结果不可预知理所当然。请看下面代码:
#include "stdafx.h"

#include <stdio.h>
#include <string.h>
int main()
{
    short a[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1 };
    char* str = (char*)a;
    short z = strlen(str);
    printf("z = %d", z);
}
输出结果:35
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
int main()
{
    short a[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
    char* str = (char*)a;
    short z = strlen(str);
    printf("z = %d", z);
}
输出结果:31

#include "stdafx.h"
#include <stdio.h>
#include <string.h>
int main()
{
    short a[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1};
    char* str = (char*)a;
    short z = strlen(str);
    printf("z = %d", z);
}
输出结果:31
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
int main()
{
    char a[] = "1234567890";
    char* str = (char*)a;
    short z = strlen(str);
    printf("z = %d", z);
}
输出结果:10
字符串可以理解为ASCII码数组结尾为0,遇到0,就认为数组结束。strlen()获得的是字符串中0前面元素的个数,注意0不是‘0’,不要用strlen()来获取非ASCII码数组元素个数,否则不是你想要的结果。


[此贴子已经被作者于2023-1-31 16:26编辑过]

2023-01-31 15:22
pvm2000
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:24
帖 子:159
专家分:256
注 册:2022-12-22
得分:1 
回复 5楼 Xovery
short是短整型,占两个字节
2023-02-01 00:46
Xovery
Rank: 2
等 级:论坛游民
帖 子:29
专家分:14
注 册:2022-10-22
得分:0 
回复 6楼 rjsp
7b 不就已经是123了吗,后面的00是补的?
2023-02-02 15:31
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用Xovery在2023-2-2 15:31:33的发言:

7b 不就已经是123了吗,后面的00是补的?

不存在前后补什么的问题,这123是16位的123,不是8位的123。
用字符串函数去处理非字符串定义的数据,题目本身就有问题,不清楚出题是为了什么,用来做反面教材?


[此贴子已经被作者于2023-2-3 07:53编辑过]

2023-02-03 07:51



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-511194-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.360647 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved