开头
大家好,我叫这是我58。今天,我们来学习既关于C语言,也关于汉字的一些知识。
1.汉字与内存
汉字,在内存中占两个字节。例如在下面的程序和在下面的监视中,存放“我
”字的str
字符串是由一个值为-50
和另一个由一个值为-46
的两个字符构成的。而存放“我
”字的字符ch
却是由一个值为-46
的字符构成的,并且,这三个字符都显示“?
”,是因为它们不在ASCII码中,所以,这三个字符才会这样显示。那为什么存放“我
”字的字符ch
是由一个值为-46
的字符构成的呢?其实是因为字符串“我
”字截断成单字节后,就变成了一个字符,也就是值为-46
的那个字符,所以,存放“我
”字的字符ch
是由一个值为-46
的字符构成的。因此,在内存中,字符串str
在内存中是这样存的:,而存放了汉字“我”的字符ch
在内存中却是这样存的:。(注:十六进制中的ce
和d2
在char
类型中分别代表了-50
和-46
这两个不存在于ASCII码表中的负数)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
char ch = '我';//err
char str[] = "我";//OK
return 0;
}
2.汉字与printf
函数
汉字,一般可以这样打印:printf("我");
;而且,也可以这样打印:printf("%s","我");
;但是,就是不能这样打印,例如:
printf("%c","我");
printf("%s",'我');
printf("%c",'我');
其中,第一个程序会打印出“$
”,第二个程序会报错,而第三个程序则会打印出“?
”,那么,这些程序为什么会做出这些事情呢?如果你不知道,就接着往下看吧。
第一个程序
在第一个程序中,会打印出“$
”是因为“我
”字符串的第一个字节是ASCII码表中的$
字符($
的十六进制值为24
),它代表的是空格(Space)。由于%c
只会打印第一个字符,所以,第一个程序输出的就只会是字符$
了1。
第二个程序
在第二个程序中,因为_Param_(2)
在对第二个程序的调用中必须是字符串的地址,但因为实际传给第二个程序的只是一个字符(字符的类型也可以是int
,也可以是char
)而已,并不是一个字符串(字符串也相当于地址)2,所以,第二个程序会报错。
第三个程序
而在第三个程序中,因为“我
”字符串截断成一个字节之后就变成了值为-46
的字符,而且又因为这个字符不在ASCII码中,所以,第三个程序会输出一个“?
”。
3.汉字与实际运用
逐汉字输出
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <Windows.h>
int main() {
char str[99999] = "";
char* pc = str;
char* pca = pc + 1;
int i = 0;
printf("请输入你想要逐字输出的汉字 -> ");
scanf("%s", str);
for (system("cls"); i < strlen(str) / 2; i++, pc += 2, pca += 2) {
printf("%c%c", *pc, *pca);
Sleep(100);
}
printf("\n");
return 0;
}
汉字七彩化
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char str[99999] = "";
char strc[6][4] = { "1;1", "3", "2;1", "6;1", "6", "5;1" };
char* pc = str;
char* pca = pc + 1;
int i = 0;
printf("请输入你想要七彩化的汉字 -> ");
scanf("%s", str);
for (system("cls"); i < strlen(str) / 2; i++, pc += 2, pca += 2) {
printf("\033[3%sm%c%c\033[0m", strc[i % 6],*pc, *pca);
}
printf("\n");
return 0;
}
结尾
在你看到这里之后,可以评论来互动一下我哦。