首页 > 其他分享 >汉字编码问题(OJ 2h奋战血泪)

汉字编码问题(OJ 2h奋战血泪)

时间:2023-04-05 11:36:54浏览次数:34  
标签:OJ color char int 汉字编码 Unicode wchar 2h name

image

永远想不到汉字的utf-8 gcc 编码其实是三个字符,我是在云IDE发现的.....

#include<bits/stdc++.h> 

using namespace std;


//A>K>Q>J>>10>9>...>3>2
struct Card{
	char name[10];
	int color;
	int number;
	void change(){
		if( strstr(name,"大王") ){
			color=11;
		}else if( strstr(name,"小王") ){
			color=10;
		}else if( strstr(name,"黑桃") ){
			color=4;
		}else if( strstr(name,"红桃") ){
			color=3;
		}else if( strstr(name,"梅花") ){
			color=2;
		}else if( strstr(name,"方块") ){
			color=1;
		}
        // printf("%s",name);
        // printf("::%d\n",strlen(name) );
        // for(int i=0;i<strlen(name);i++){
        //     printf("%d ",name[i]);
        // }
        // puts("");
		switch (name[6]){
		case 'A':{
			number=23;
			break;
		}
		case 'K':{
			number=22;
			break;
		}
		case 'Q':{
			number=21;
			break;
		}
        case 'J':{
			number=20;
			break;
		}
		default:{
			if(name[7]=='0')
				number=10;
			else 
				number=name[6]-'0';
			break;
		}
		}
	}
	bool operator<(const Card&x)const{
		if(color!=x.color)
		    return color>x.color;
		else 
			return number>x.number;
	}
}var[1000];

signed main(void)
{								
	int  T;
	scanf("%d",&T);
	while(T--){
		int n;
		scanf("%d",&n);
		for(int i=1;i<=n;i++){
			scanf("%s",var[i].name);
			var[i].change();
		}
		sort(var+1,var+1+n);
		for(int i=1;i<=n;i++){
			printf(" %s"+(i==1),var[i].name);
		}
		printf("\n");
	}
	return 0;
}

汉字编码问题

编码就是把什么东西当作什么的问题,计算机善于处理数字,任何自然状态下不能表示为数字的东西,都是难以直接处理的;若我们可以把那些东西都用数字表示出来,那就可以被计算机处理,享受计算机的带来的便利;
字符串在计算机内部主要是以末尾有\0char数组形式储存;这个东西发源西方,对于中文,处理char的编译器(gcc,clang)就不认识了,本质上是编译器采取的utf-8编码和GBK编码(策略)不能把汉字处理成一个字面量;所以出现了unicode编码去用一个'字符'(多个字节)去代表中文;
C语言内部的Unicode就是wchar_t;
在实验的过程中可以发现汉字输入进去之后是不止一个字符的,但也不一定是两个字符,而且其char保存的数值还是负数,大概是当初ASCII码编写的是时候没有留位置或者是需要当作unsigned char去处理;

数据类型 编码 size_t
clang gcc
char GBK 8 两个 8 两个
char utf-8 (BOM)8两个/12三个个 12三个
wchar_t Unicode 一个 一个

Unicode

Unicode编码不是char类型自然拥有的编码,他需要用新的数据类型,在C语言内部就是wchar_t,那么也有相应的处理这个的函数,egwprintf() , wscanf
转换成Unicode:
clang: utf-8(有bom) -> gbk -> Unicode
gcc: utf-8(默认)->Unicode

#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main()
{
    wchar_t a [] = L"ABCD";
    wchar_t b [] = L"\x41\x42\x43\x44";

    setlocale(LC_ALL, "");
    wprintf(L"a:%ls b:%ls", a, b);
    return 0;
}

printf()是根据格式控制符来解释内存中的内容的,所以,当我们用 char*wchar_t * 时,格式控制就很重要了,不然一个 wchar_t* 直接作为 char * 来解释或翻过来解释,结果你可以想得到的,对吧;

标签:OJ,color,char,int,汉字编码,Unicode,wchar,2h,name
From: https://www.cnblogs.com/ZZQ323/p/17289004.html

相关文章

  • HDOJ2067_小兔的棋盘(卡塔兰数)
    小兔的棋盘TimeLimit:1000/1000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):11339    AcceptedSubmission(s):5717ProblemDescription小兔的叔叔从外面旅游回来给她带来了一个礼物,小兔高兴地跑回自己的房间,拆开一......
  • HDOJ2091 空心三角形
    空心三角形TimeLimit:1000/1000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):49528    AcceptedSubmission(s):13429ProblemDescription把一个字符三角形掏空,就能节省材料成本,减轻重量,但关键是为了追求另一种视觉效......
  • HDOJ1017 A Mathematical Curiosity
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1017这个题目其实挺坑的。首先是N,应该挺多人纠结过这个N,N其实是blocks(块),一块有未知个cases。一个块的结束标志是0,0。然后是PE的问题,空格、空行,我也是被坑的好惨。这里应该是每个块之间有一个空行!也就是说,最后一个块是不......
  • HDOJ1799 循环多少次?
    循环多少次?TimeLimit:3000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):5459    AcceptedSubmission(s):2122ProblemDescription  我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分。例如,......
  • HDOJ1994 利息计算
    利息计算TimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):6791    AcceptedSubmission(s):4634ProblemDescription为自行解决学费,chx勤工俭学收入10000元以1年定期存入银行,年利率为3.7%。利率按......
  • bzoj 4237 稻草人
    4237:稻草人TimeLimit: 40Sec  MemoryLimit: 256MBSubmit: 791  Solved: 353[Submit][Status][Discuss]DescriptionJOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典。有一次,JOI村的村长听到了稻草人们的启示,计划在荒......
  • 【POJ1679】The Unique MST(非严格次小生成树)
    problem给出一个连通无向图,判断它的最小生成树是否唯一如果唯一,输出生成树的大小,否则输出”NotUnique!”solution直接求非严格次小生成树如果次小生成树等于最小生成树则说明最小生成树不唯一,否则最小生成树一定是唯一的vector会TLE。。。codes#include<iostream>#include<algori......
  • bzoj 3622 已经没有什么好害怕的了
    3622:已经没有什么好害怕的了TimeLimit: 10Sec  MemoryLimit: 256MBSubmit: 805  Solved: 377[Submit][Status][Discuss]DescriptionInputOutputSampleInput42535154540201030SampleOutput4HINT输入的2*n个数字保证全不相同。......
  • buuctf.pwn.jarvisoj_level2
    这个题目,是缓冲区溢出检测一下Nocanaryfound:可以看出没有栈保护NOPIE:没有地址随机化然后分析题目这一次我在网上看到了不同的解法,但是基本思路是一致的主要看一下这个溢出ssize_tvulnerable_function(){charbuf[136];//[esp+0h][ebp-88h]BYREFsys......
  • POJ 2773 Happy 2006 二分+容斥原理(二进制枚举或dfs)
    Happy2006TimeLimit: 3000MS MemoryLimit: 65536KTotalSubmissions: 14003 Accepted: 4946DescriptionTwopositiveintegersaresaidtoberelativelyprimetoeachotheriftheGreatCommonDivisor(GCD)is1.Forinstance,1,3,5,7,9...areallrelativel......