• 类型(type)判断


    windows下源文件编码问题

    在windows下不要直接右击桌面创建.txt再改成.c,这种方式容易引起编码问题

    windows下gvim的设置:
    先打开gvim再用:w newfile.c这种方式来创建新文件
    vimrc文档中设置保存文件的编码方式为chinese或gbk

    • set fileencoding=chinese //gbk也可以

    char与wchar_t

    • 英文字符在char中占一位,汉字字符在char中占两位;
      char采用可变长编码(具体取决于编译器),与printf配合使用

    • 英文字符和中文字符在wchat_t中统一占两位.
      wchat_t采用unicode编码,与wprintf配合使用
      在字符字面量前统一加L

    编码范围

    英文字符(ascii, 含标点,字母,数字): 0x00-0x7F,每个英文字符占一个字节(char)
    汉字字符(GB2312, 含汉字及标点): 0xA1A1(41377) - 0xFEFE(65278), 每个汉字字符占两个字节
    汉字范围: 0xB0A1(45217) - 0xF7FE(63486)

    注: wchat_t使用unicode编码,每个字符占两个字节,中文范围是4E00-9FBF, unicode里面包含了各个国家语言文字的编码,而GB2312是汉字的一个专有编码集

    内置类型判断函数

    #include <stdio.h>
    #include <ctype.h>
    #include <limits.h>
    
    static void prclass(const char *name,int (*fn)(int)){
        int c;
    
        fputs(name,stdout);
        fputs(": ",stdout);
        for(c=EOF;c <= UCHAR_MAX;++c)
            if((*fn)(c))
                fputc(c,stdout);
        fputs("
    ",stdout);
    }
    
    int main(int argc,char *argv[]){
        prclass("ispunct",&ispunct);
        prclass("isdigit",&isdigit);
        prclass("islower",&islower);
        prclass("isupper",&isupper);
        prclass("isalpha",&isalpha);
        prclass("isalnum",&isalnum);
        return 0;
    }
    

    打印汉字

    需配合setlocale使用, ".936"代表GBK编码,以下三选一
    setlocale(LC_ALL,"");
    setlocale(LC_ALL, "chinese-simplified" )
    setlocale(LC_CTYPE,".936");

    #include <stdio.h>
    #include <stdlib.h>
    #include <stddef.h>
    #include <locale.h>
    
    int main(int argc,char *argv[]){
        setlocale(LC_CTYPE,".936");
        wchar_t str[]=L"我是abc";    
        wprintf(L"%s
    ",str); //printf与char*也是可以输出中文的
        return 0;
    }
    

    英文与汉字区分

    判断一个数组中的字符为汉字字符或英文字符时,先以unsigned char方式检查char[0],
    如果char[0] <= 7F则判定为英文字符,如果char[0]>= A1 && char[1]>=A1则判定为中文字符,更完整的应该是把上限也判断一下

    #include <stdlib.h>
    #include <stdio.h>
    
    int word_test(const unsigned char *s){
        if(s[0] <= 0x7F){
            printf("en ");
            return 0;
        }
        else if((s[0] >= 0xA1) && (s[1] >= 0xA1)){
            printf("zh-cn ");
            return 1;
        }
        else{
            printf("unknown ");
            return -1;
        }
    }
    
    void sentence_test(const unsigned char *s){
        int i=0,ret;
        while(s[i] != ''){
            ret=word_test(&s[i]); 
            if(ret == 0)
                i++;
            else if(ret == 1)
                i+=2;
            else
                exit(-1);
        }
        printf("[count of char=%d
    ",i);
    }
    int main(int argc, const char *argv[]){
        word_test("我");
        puts("");
        word_test("a");
        puts("");
        sentence_test("w我是abc");
        return 0;
    }
    

    统计文件中的字符数

    运行时输入绝对路径,

    #include <stdio.h>
    #include <ctype.h>
    #include <assert.h>
    
    int main(int argc,char *argv[]){
        FILE *fp=fopen(argv[1],"r"); 
        assert(fp != NULL);
    
        int alpha=0,num=0,punc=0;
        char c;
        while((c=fgetc(fp)) != EOF){
            if(isalpha(c))
                alpha++;
            if(isdigit(c))
                num++;
            if(ispunct(c))
                punc++;
        }
        printf("count of alpha=%d
    ",alpha);
        printf("count of num=%d
    ",num);
        printf("count of punc=%d
    ",punc);
        return 0;
    }
    

    GB2312获取汉字首字母

    #include <stdlib.h>
    #include <locale.h>
    #include <stdio.h>
    #include <string.h>
    
    #define CONVERT(start, end, code, letter) if(code >= start && code <= end) return letter
    char Convert(wchar_t n){
        // 根据汉字区域码获取拼音声母GB2312,不适用于wchar_t(unicode)
        CONVERT(0xB0A1, 0xB0C4, n, 'A');
        CONVERT(0XB0C5, 0XB2C0, n, 'B');
        CONVERT(0xB2C1, 0xB4ED, n, 'C');
        CONVERT(0xB4EE, 0xB6E9, n, 'D');
        CONVERT(0xB6EA, 0xB7A1, n, 'E');
        CONVERT(0xB7A2, 0xB8C0, n, 'F');
        CONVERT(0xB8C1, 0xB9FD, n, 'G');
        CONVERT(0xB9FE, 0xBBF6, n, 'H');
        CONVERT(0xBBF7, 0xBFA5, n, 'J');
        CONVERT(0xBFA6, 0xC0AB, n, 'K');
        CONVERT(0xC0AC, 0xC2E7, n, 'L');
        CONVERT(0xC2E8, 0xC4C2, n, 'M');
        CONVERT(0xC4C3, 0xC5B5, n, 'N');
        CONVERT(0xC5B6, 0xC5BD, n, 'O');
        CONVERT(0xC5BE, 0xC6D9, n, 'P');
        CONVERT(0xC6DA, 0xC8BA, n, 'Q');
        CONVERT(0xC8BB, 0xC8F5, n, 'R');
        CONVERT(0xC8F6, 0xCBF9, n, 'S');
        CONVERT(0xCBFA, 0xCDD9, n, 'T');
        CONVERT(0xCDDA, 0xCEF3, n, 'W');
        CONVERT(0xCEF4, 0xD1B8, n, 'X');
        CONVERT(0xD1B9, 0xD4D0, n, 'Y');
        CONVERT(0xD4D1, 0xD7F9, n, 'Z');
        return '';
    }
    
    void py_Invert(const char *src,char *ret,int size){
        const char *sChinese = src;
    
        wchar_t wchr = 0;
        int nCount = strlen(sChinese) / 2;
    
        int i,j;
        char rst;
        for (i = 0, j = 0; i < nCount,i<size-1; ++i){
            wchr = (sChinese[j++] & 0xff) << 8; // 高字节
            wchr |= (sChinese[j++] & 0xff);        // 低字节
            
            ret[i]=Convert(wchr);
        }
        ret[i]=0;
    }
    int main(int argc,char *argv[]){
        setlocale(LC_CTYPE,".936");
        char str[]="这是测试";
        char ret[10]={0};
        py_Invert(str,ret,10);
        printf("%s
    ",ret);
        return 0;
    }
    

    以GB2312编码打印所有汉字

    #include <stdlib.h>
    #include <locale.h>
    #include <stdio.h>
    
    int main(int argc,char *argv[]){
        setlocale(LC_CTYPE,".936");
        char test1[3]={0xB0,0xA1,0};
    
        unsigned char index;
        for(index=0xA1;index<=0xFF;index++){
            test1[1]=index;
            printf("%s ",test1);
            if(index == 0xFF)
                test1[0]=(unsigned char)test1[0]+1;
            if(((unsigned char)test1[0] == 0xD7) && ((unsigned char)test1[1] == 0xF9))
                break;
        }
        return 0;
    }
    
  • 相关阅读:
    两种unix网络编程线程池的设计方法
    僵尸进程处理方法
    僵尸进程概念
    fork()父子进程文件描述符的关系
    getsockname()和getpeername()
    linux文件系统总结
    deque时间复杂度和vector,list比较
    stl仿函数和适配器
    linux中断和异常睡眠问题
    umask码和文件权限
  • 原文地址:https://www.cnblogs.com/cfans1993/p/6404027.html
Copyright © 2020-2023  润新知