汉字与C语言

开头

大家好,我叫这是我58。今天,我们来学习既关于C语言,也关于汉字的一些知识。

1.汉字与内存

汉字,在内存中占两个字节。例如在下面的程序和在下面的监视中,存放“”字的str字符串是由一个值为-50和另一个由一个值为-46的两个字符构成的。而存放“”字的字符ch却是由一个值为-46的字符构成的,并且,这三个字符都显示“?”,是因为它们不在ASCII码中,所以,这三个字符才会这样显示。那为什么存放“”字的字符ch是由一个值为-46的字符构成的呢?其实是因为字符串“”字截断成单字节后,就变成了一个字符,也就是值为-46的那个字符,所以,存放“”字的字符ch是由一个值为-46的字符构成的。因此,在内存中,字符串str在内存中是这样存的:,而存放了汉字“我”的字符ch在内存中却是这样存的:(注:十六进制中的ced2char类型中分别代表了-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;
}

结尾

在你看到这里之后,可以评论来互动一下我哦。


  1. 选自C知道 ↩︎

  2. 来自警告 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值