注册 登录
编程论坛 C语言论坛

老师给的题目不是很会

Xovery 发布于 2023-01-30 15:29, 2289 次点击
程序代码:
#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);
}
11 回复
#2
Xovery2023-01-30 15:29
为什么最后  z=5 啊
#3
rjsp2023-01-30 15:47
先去除不相干的代码,变为
程序代码:
#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编辑过]

#4
吹水佬2023-01-30 15:47
-1, 257, 123 内码 ff ff 01 01 7b 00
#5
Xovery2023-01-30 16:04
我查内存了
为什么123是7b 00啊
#6
rjsp2023-01-30 16:20
回复 5楼 Xovery
那你认为应该是什么?你不说出来,别人没法回答呀
#7
billliu662023-01-31 15:22
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编辑过]

#8
pvm20002023-02-01 00:46
回复 5楼 Xovery
short是短整型,占两个字节
#9
Xovery2023-02-02 15:31
回复 6楼 rjsp
7b 不就已经是123了吗,后面的00是补的?
#10
吹水佬2023-02-03 07:51
以下是引用Xovery在2023-2-2 15:31:33的发言:

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

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


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

#11
如何期待2023-02-03 10:45
#12
万家乐2023-02-15 21:53
这段程序代码涉及到指针、数组和字符串,以下是每行代码的解释和执行过程:

c
Copy code
#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);
}
#include <stdio.h> 和 #include <string.h> 是预处理指令,包含了头文件 stdio.h 和 string.h。

int main() 是程序的入口函数,程序从这里开始执行。

short a[] = { -1, 257, 123, 62, 91, 18, 44, 73, 0, 26 }; 定义了一个 short 类型的数组 a,包含了 10 个元素。

short* p = &a[1], * q = a + 5; 定义了两个 short 类型的指针变量 p 和 q,分别指向数组 a 的第 2 个元素和第 6 个元素。

short x = *++p, y = *(q + 1); 这一行代码等价于下面两行代码:

c
Copy code
++p;
short x = *p;
short y = *(q + 1);
第一句将指针 p 向前移动一个元素,指向了 a[2],第二句将 a[2] 的值赋给变量 x,将 a[6] 的下一个元素 a[7] 的值赋给变量 y。

char* str = (char*)a; short z = strlen(str); 这一行代码等价于下面两行代码:

c
Copy code
char* str = (char*)a;
short z = strlen(str);
第一句将数组 a 的首地址强制转换为 char 类型的指针,赋给了变量 str,此时 str 指向 a[0]。第二句调用了字符串函数 strlen(),返回了指针 str 指向的字符串的长度,也就是数组 a 中第一个元素 a[0] 后面的元素的长度,但是 a[0] 后面并没有以 '\0' 结尾的字符,因此 strlen() 函数会继续扫描数组 a 的内存,直到遇到内存中第一个值为 0 的字节为止,返回的是扫描到的字节数,这个值存在 short 类型的变量 z 中。

需要注意的是,由于 a 数组中的元素类型是 short,每个元素占用的字节数是 2,而 strlen() 函数是按照每个字符占用一个字节来计算字符串长度的,因此在这段代码中,变量 z 实际上记录了数组 a 的前 10 个字节中,从 a[0] 开始到 a[8] 的 9 个字节的长度,也就是 18。同时,由于 a[9] 的值为 0,因此 strlen() 函数会停止扫描,不会继续计算 a[9] 之后的字节。



1