junran 发表于 2021-9-28 08:30:25

S1E22中关于C语言字符数组中文字符所占字节的问题

本帖最后由 junran 于 2021-9-28 08:30 编辑



做作业时发现,关于中文字符的题目一道也做不出来
后来发现复制小甲鱼的代码也时对时不对

经过本人夜以继日的测试,发现中文字符的ascii码在我的电脑上是随机的
https://i.loli.net/2021/09/28/9U1o6lOFWMu2waK.png
可能为正,也可能为负
https://i.loli.net/2021/09/28/KLOE7d3SIjgPhWk.png
而且在字符数组中所占位置为1字节而不是小甲鱼所说的3字节
这究竟是为什么呢?

更有意思的是,只要我初始化字符数组给定中文字符串,那么中文就占3字节
https://i.loli.net/2021/09/28/SQKNT2RVeyIOwAM.png

将字符数组变成输入赋值后就变成了1字节了
https://i.loli.net/2021/09/28/nub1xvCXL2A7zGp.png


百思不得其解,求助各位大大了

人造人 发表于 2021-9-28 08:38:37

试试这个代码输出的内容和你在调试器中看到的是不是一样
#include <stdio.h>

int main(void) {
    const char *str = "你好 - hello";
    for(size_t i = 0; str; ++i) printf("%d ", str);
    printf("\n");
    return 0;
}


我这边的输出
$ ./main
-28 -67 -96 -27 -91 -67 32 45 32 104 101 108 108 111

junran 发表于 2021-9-28 08:40:06

人造人 发表于 2021-9-28 08:38
试试这个代码输出的内容和你在调试器中看到的是不是一样




是一样的{:5_99:}

junran 发表于 2021-9-28 08:41:38

人造人 发表于 2021-9-28 08:38
试试这个代码输出的内容和你在调试器中看到的是不是一样




试试手动输入的?我这边也是,只要初始化中赋值了就没毛病,但是fgets输入就有问题

人造人 发表于 2021-9-28 08:45:46

我估计 你夜以继日的测试,最终得到的结果是 vscode 的问题,^_^
测试的时候,顺便把数组的内容输出出来,像我上面那样,用 printf 输出出来,看看是不是和 vscode 调试器中的内容一样
printf 输出出来的内容是没问题的,就是内存中的数字
vscode 调试器中输出的就不一定了

这样加上索引也许更好,更方便你调试
#include <stdio.h>

int main(void) {
    const char *str = "你好 - hello";
    for(size_t i = 0; str; ++i) printf("[%lu] = %d\n", i, str);
    return 0;
}

人造人 发表于 2021-9-28 08:46:41

$ ./main
= -28
= -67
= -96
= -27
= -91
= -67
= 32
= 45
= 32
= 104
= 101
= 108
= 108
= 111

人造人 发表于 2021-9-28 08:49:02

junran 发表于 2021-9-28 08:41
试试手动输入的?我这边也是,只要初始化中赋值了就没毛病,但是fgets输入就有问题

没关系呀,你手动输入好了,然后再输出出来,关键是要看内存中保存的是什么
#include <stdio.h>

int main(void) {
    char str;
    fgets(str, 1024, stdin);
    for(size_t i = 0; str; ++i) printf("[%lu] = %d\n", i, str);
    return 0;
}


$ ./main
你好 - hello
= -28
= -67
= -96
= -27
= -91
= -67
= 32
= 45
= 32
= 104
= 101
= 108
= 108
= 111
= 10

junran 发表于 2021-9-28 08:53:33

人造人 发表于 2021-9-28 08:49
没关系呀,你手动输入好了,然后再输出出来,关键是要看内存中保存的是什么

https://i.loli.net/2021/09/28/FamdbZneSwLhu5s.png
所以是我的电脑有问题吗{:5_104:}

人造人 发表于 2021-9-28 08:54:56

junran 发表于 2021-9-28 08:53
所以是我的电脑有问题吗

在 202 行下断点

人造人 发表于 2021-9-28 08:55:37

junran 发表于 2021-9-28 08:53
所以是我的电脑有问题吗

就是执行到 202 行的时候停下来,看调试器中输出的是不是和 printf 输出的一样

人造人 发表于 2021-9-28 08:59:00

junran 发表于 2021-9-28 08:53
所以是我的电脑有问题吗

这样
#include <stdio.h>

int main(void) {
    char str;
    fgets(str, 1024, stdin);
    printf("%s", str);
    for(size_t i = 0; str; ++i) printf("[%lu] = %d\n", i, str);
    return 0;
}

junran 发表于 2021-9-28 09:04:21

人造人 发表于 2021-9-28 08:59
这样

https://i.loli.net/2021/09/28/w1Jvt2gyIEijC9s.png

junran 发表于 2021-9-28 09:05:44

人造人 发表于 2021-9-28 08:59
这样

然而这个负数只是偶然https://i.loli.net/2021/09/28/lZv4M7yAxboctf9.png

人造人 发表于 2021-9-28 09:07:58

junran 发表于 2021-9-28 09:04


很明显了,vscode 的问题,'你好' 这两个中文字符没有输入到内存中,也可以说成是 输入到内存中的 '你好' 这两个中文字符是错误的
因为 fgets 下面的 printf 按 %s 输出输入的字符串,结果显示输出的内容不对,说明保存到内存中的字符串不是
'你好 - hello'

junran 发表于 2021-9-28 09:11:56

人造人 发表于 2021-9-28 09:07
很明显了,vscode 的问题,'你好' 这两个中文字符没有输入到内存中,也可以说成是 输入到内存中的 '你好' ...

{:5_98:}{:5_98:}就是说如果我用支持中文字符的编译器的话,他就一定会是3个字节而且都为负数对吧?

人造人 发表于 2021-9-28 09:14:10

junran 发表于 2021-9-28 09:11
就是说如果我用支持中文字符的编译器的话,他就一定会是3个字节而且都为负数对吧?

不一定,这还要看你文件的编码
你换一个 dev-c++ 试一试就知道了

junran 发表于 2021-9-28 09:15:20

人造人 发表于 2021-9-28 09:14
不一定,这还要看你文件的编码
你换一个 dev-c++ 试一试就知道了

好的,了解了,谢谢

人造人 发表于 2021-9-28 09:27:10

junran 发表于 2021-9-28 09:15
好的,了解了,谢谢



$ ./main
你好 - hello
你好 - hello
= -60
= -29
= -70
= -61
= 32
= 45
= 32
= 104
= 101
= 108
= 108
= 111
= 10
页: [1]
查看完整版本: S1E22中关于C语言字符数组中文字符所占字节的问题