C语言 全角半角 测试

本文详细介绍了C语言中全角和半角字符的概念,并提供了转换函数实现全角到半角、半角到全角的转换。通过示例代码展示了转换过程,包括字符长度变化及打印效果。主要涉及字符编码与ASCII码的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很久没有见到这个问题了

C语言 全角半角

1. 全角是什么?

全角是什么?

2. 半角是什么?

半角是什么?


在这里插入图片描述

#include<stdio.h>
#include<ctype.h>
#include<string.h>

// 这两个是全角半角切换的函数
// 下面就是把一个占用一个字节的字符转为占用两个字节的字符
void quan_to_ban(char quan[], char *ban); // 全--半角 *ban *quan 这玩意是指针
void ban_to_quan(char ban[], char *quan); // 半--全角

// 因为汉字占用两个字节,所以全角半角汉字都一样
//汉字对应的ASCLL:https://blog.csdn.net/qq_44009311/article/details/86650341

/*下面最好对着运行结果理解 */
int main() {
	int i;
	/*1. 测试*/
	printf("\161\n"); // 直接输出半角字符
	printf("%d %d\n", '\161', 'q'); // 他们的数值是一样的,这个同ASCII一样是有字典的 ,你可以自己写个循环打印
	printf("半角[%s]的长度为:%d\n", "\161", strlen("\161")); // 先看看半角的长度
	// 把 "\161" 转为全角试试
	char q[100];
	ban_to_quan("\161", q);
	printf("全角[%s]的长度为:%d\n", q, strlen(q)); // 在看看全角的长度
	puts("\n\n");

	/*2. 半角转全角*/
	char s_ban1[] = "q r s";
	char s_quan1[100];  // 这个大小最少要 strlen(s)*2,因为通过a的长度可以看出全角是半角的2倍。一般给他的三四倍,多余也没事,起码不会出现段错误
	ban_to_quan(s_ban1, s_quan1);
	printf("[%s]转为全角[%s]\n", s_ban1, s_quan1); // s转为t,你会发现打印出来的字母和空格,空格的距离会变得很远,这就是全角
	for(i=0; i<strlen(s_quan1); i+=2) { // 打印的时候需要两个字符连在一起【同打印汉字】
		printf("%c%c,", s_quan1[i],s_quan1[i+1]);
	}
	puts("\n\n");


	/*3. 全角转半角*/
	// ***切换输入法为全角模式,再重新赋值【输入法菜单栏一般会有月亮,太阳是全角,月亮是半角[默认:shift+空格]】
	char s_quan2[] = "q r s"; // 从样式就可以看出全角半角区别吧
	char s_ban2[100];
	quan_to_ban(s_quan2, s_ban2); //  s_quan2转为半角,返回到 s_ban2中
	printf("[%s]转为半角[%s]\n", s_quan2, s_ban2);
	return 0;

}



/**/


//全角转半角  quan --> ban, ban通过指针返回
void quan_to_ban(char quan[], char *ban) {
	for(; *quan; ++quan) { // 循环替换
		if((*quan & 0xff) == 0xA1 && (*(quan + 1) & 0xff) == 0xA1) {      //全角空格
			*ban++ = 0x20;
			++quan;
		} else if((*quan & 0xff) == 0xA3 && (*(quan + 1) & 0xff) >= 0xA1 && (*(quan + 1) & 0xff) <= 0xFE)  //ASCII码中其它可显示字符
			*ban++ = *++quan - 0x80;
		else {
			if(*quan < 0)    //中文占用两个字节
				*ban++ = *quan++;
			*ban++ = *quan;
		}
	}
	*ban = '\0'; // 最后一个要结尾符
}
//半角转全角
//输入半角字符串ban,返回全角字符串*quan
void ban_to_quan(char ban[], char *quan) {
	for(; *ban; ++ban) { // 循环替换
		if((*ban & 0xff) == 0x20) {  //半角空格
			*quan++ = 0xA1;
			*quan++ = 0xA1;
		} else if((*ban & 0xff) >= 0x21 && (*ban & 0xff) <= 0x7E) {
			*quan++ = 0xA3;
			*quan++ = *ban + 0x80;
		} else {
			if(*ban < 0)   //中文占用两个字节
				*quan++ = *ban++;
			*quan++ = *ban;
		}
	}
	*quan = '\0'; // 最后一个要结尾符
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跨端蝴蝶

篮球弹弹弹

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值