char 只能处理 ASCII 编码中的英文字符。
C语言规定,对于 ASCII 编码之外的单个字符,使用宽字符的编码方式。wchar_t 的长度由编译器决定:
宽字符的编码方式,就得加上L前缀,例如L’A’、L’9’、L’中’、L’国’,加上L前缀后,所有的字符都将成为宽字符,占用 2 个字节或者 4 个字节的内存,包括 ASCII 中的英文字符。
#include <wchar.h>
#include <locale.h>int main(){wchar_t a = L'A'; //英文字符(基本拉丁字符)wchar_t b = L'9'; //英文数字(阿拉伯数字)wchar_t c = L'中'; //中文汉字wchar_t d = L'国'; //中文汉字wchar_t e = L'。'; //中文标点wchar_t f = L'ヅ'; //日文片假名wchar_t g = L'♥'; //特殊符号wchar_t h = L'༄'; //藏文//将本地环境设置为简体中文setlocale(LC_ALL, "zh_CN");//使用专门的 putwchar 输出宽字符putwchar(a); putwchar(b); putwchar(c); putwchar(d);putwchar(e); putwchar(f); putwchar(g); putwchar(h);putwchar(L'n'); //只能使用宽字符//使用通用的 wprintf 输出宽字符wprintf(L"Wide chars: %lc %lc %lc %lc %lc %lc %lc %lcn", //必须使用宽字符串a, b, c, d, e, f, g, h);return 0;
}
getche() 一样,getch() 也位于 conio.h 头文件中,也不是标准函数,默认只能在 Windows 下使用,不能在 Linux 和 Mac OS 下使用。
getchar()是带有缓冲区的,每次从缓冲区中读取一个字符,包括空格、制表符、换行符等空白符,只要我们让 getchar() 不停地读取,直到读完缓冲区中的所有字符,就能达到清空缓冲区的效果。
#include <stdio.h>
#include <conio.h>int main(){char str[12]; int a;char temp;scanf("%3s", str);while((temp=getchar()) != 'n' && temp != EOF);scanf("%2d", &a);printf("%s, %d", str, a);return 0;
}
scanf()允许把读取到的数据直接丢弃,不往变量中存放,具体方法就是在 % 后面加一个*,例如:
%d表示读取一个整数并丢弃;
%[a-z]表示读取小写字母并丢弃;
%*[^n]表示将换行符以外的字符全部丢弃。
%{*} {width} type
#include <stdio.h>
#include <conio.h>int main(){char str[12]; int a;char temp;scanf("%3s", str);scanf("%*[^n]");scanf("%*c");scanf("%2d", &a);printf("%s, %d", str, a);return 0;
}
在 Windows 系统中,conio.h头文件中的kbhit()函数就可以用来实现非阻塞式键盘监听。 用户每按下一个键,都会将对应的字符放到输入缓冲区中,kbhit() 函数会检测缓冲区中是否有数据,如果有的话就返回非 0 值,没有的话就返回 0 值。但是 kbhit() 不会读取数据,数据仍然留在缓冲区,所以一般情况下我们还要结合输入函数将缓冲区种的数据读出。
#include <stdio.h>
#include <windows.h>
#include <conio.h>int main(){char ch;int i = 0;//循环监听,直到按Esc键退出while(1){if(kbhit()){ //检测缓冲区中是否有数据ch = getch(); //将缓冲区中的数据以字符的形式读出if(ch == 27){break;}}printf("Number: %dn", ++i);Sleep(1000); //暂停1秒}return 0;
}
getch()
函数不带回显,输入的字符不会在界面显示。
#include <stdio.h>
#include <conio.h>int main(){char yang; char psd[20];int index;while ((yang = getch()) != 'r'){if (yang != 'b'){printf("*");psd[index++] = yang;}else if (index>= 1 && yang == 'b'){psd[--index] = '