1、第一个程序:hello world
创建项目–空项目(名称、目录)–工程
源文件–v++(hello.c)–敲代码
代码展示:
#include <stdio.h> //包含头文件 input output
#include <stdint.h>
//编程规范
//注释 源文件
//入口代码
int main(int argc, char* argv[]) {
print("hello world\n");// \n是转义字符 换行的意思
return 0;
}
代码效果图:
2、数据类型
2.1 变量
2.1.1 变量
在程序运行过程中,其值可以改变
变量在使用前必须先定义,定义变量前必须有相应的数据类型
2.1.2 标识符命名规则:
标识符不能是关键字
标识符只能由字母、数字、下划线组成
第一个字符必须为字母或下划线
标识符中字母区分大小写
2.1.3 变量特点:
变量在编译时为其分配相应的内存空间
可以通过其名字和地址访问相应内存
2.1.4.匈牙利命名法
匈牙利命名法是一种编程时的命名规范。基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。要基于容易记忆容易理解的原则。
变量属性:
属性部分:
g_ 全局变量
c_ 常量
m_ c++类成员变量
s_ 静态变量
类型部分:
数组 a
指针 p
函数 fn
无效 v
句柄 h
长整型 l
布尔 b
浮点型(有时也指文件) f
双字 dw
字符串 sz
短整型 n
双精度浮点 d
计数 c(通常用cnt)
字符 ch(通常用c)
整型 i(通常用n)
字节 by
字 w
实型 r
无符号 u
描述部分:
最大 Max
最小 Min
初始化 Init
临时变量 T(或Temp)
源对象 Src
目的对象 Dest
举例
hwnd : h 是类型描述,表示句柄, wnd 是变量对象描述,表示窗口,所以 hwnd 表示窗口句柄;
pfnEatApple : pfn 是类型描述,表示指向函数的指针, EatApple 是变量对象描述,所以它表示指向 EatApple 函数的函数指针变量。
g_cch : g_ 是属性描述,表示全局变量,c 和 ch 分别是计数类型和字符类型,一起表示变量类型,这里忽略了对象描述,所以它表示一个对字符进行计数的全局变量。
2.2数据类型
数据类型 | 占用空间 | 数据范围 | |
---|---|---|---|
char | 字符型 | 1字节 | -128 ~ 127 |
short/short int | 短整型 | 2字节 | -32768 ~ 32767 |
int | 整型 | 4字节 | -2147483648 2147483647 |
long/long int | 整型 | 4字节 | -2147483648 2147483647 |
long long/long long int | 长整型 | 8字节 | -2^64/2 ~ 2^64/2-1 |
unsigned char | 无符号字符型 | 1字节 | 0 ~ 255 |
unsigned short/short int | 无符号字符型 | 2字节 | 0 ~ 65536 |
unsigned int | 整型 | 4字节 | 0 ~ 4294967296 |
unsigned long/long int | 整型 | 4字节 | 0 ~ 4294967296 |
unsigned long long/long long int | 长整型 | 8字节 | 0 ~ 2^64-1 |
float | 单精度浮点型 | 4字节 | |
double | 双精度浮点型 | 8字节 |
3.输入 输出函数
3.1格式规范语法: printf
和 scanf
函数
printf 格式化输出数据到标准输出设备
scanf 从标准输入设备格式化输入数据到变量
#include <stdio.h>
int main()
{
int b;
printf("请输入b的值:");
scanf("%d", &b);
printf("b = %d\n", b);
return 0;
}
3.2类型字段字符
类型字符 | 参数 | 输出格式 |
---|---|---|
c | 字符 | 与 printf 函数一起使用时,指定单字节字符;与 wprintf 函数一起使用时,指定宽字符。 |
C | 字符 | 与 printf 函数一起使用时,指定宽字符;与 wprintf 函数一起使用时,指定单字节字符。 |
d | Integer | 带符号十进制整数。 |
i | Integer | 带符号十进制整数。 |
o | Integer | 无符号八进制整数。 |
u | Integer | 无符号十进制整数。 |
x | Integer | 无符号十六进制整数;使用 " abcdef "。 |
X | Integer | 无符号十六进制整数;使用 " ABCDEF "。 |
e | 浮点 | 格式为 [-] e± [ ]的有签名值,其中 是一个十进制数字,是一个或多个十进制数字,具体取决于指定的精度,或者默认为六位 d.dddd d.dddd dd d d dddd dd ,[ d ]*dd *是两个或三个十进制数字,具体取决于输出格式和指数的大小。 |
E | 浮点 | 与 格式 e 相同,只不过 E 而不是 e 引入了指数。 |
f | 浮点 | 格式为 [-] .的有签名值 dddd dddd dddd , dddd 其中 是一个或多个十进制数字。 小数点前的数字位数取决于数字的度量值,小数点后的数字位数取决于请求的精度,或为默认的六位数。 |
F | 浮点 | 与 格式相同 f ,只不过无穷大和 nan 输出大写。 |
g | 浮点 | 有签名值以 f 或 e 格式显示,以更精简的给定值和精度为准。 只有当值的指数小于 -4 或大于或等于精度参数时,才 e 使用 e 。 截去尾随零,仅当后跟一个或多个数字时,才会显示小数点。 |
G | 浮点 | 与 格式 g 相同,只不过 在适用位置引入指数 E ****e (() )。 |
a | 浮点 | 采用*[-]0xh.hhhh*p±格式的有签名十六进制双精度浮点值,其中 h.hhhh是十六进制数字 (使用小写字母) 作为指数的一个或多个数字。 精度指定此点后的数字位数。 |
A | 浮点 | 采用*[-]0Xh.hhhhP±格式的有签名十六进制双精度浮点值,其中 h.hhhh是十六进制数字 (使用大写字母) 表示指数,dd*是指数的一个或多个数字。 精度指定此点后的数字位数。 |
n | 指向整数的指针 | 目前成功写入流或缓冲区的字符数。 此值存储在地址作为自变量的整数中。 可通过参数大小规范前缀控制指向的整数的大小。 n 说明符默认为禁用;请参阅重要的安全说明了解相关信息。 |
p | 指针类型 | 以十六进制数字显示参数作为地址。 |
s | String | 与 printf 函数一起使用时,指定单字节或多字节字符串;与 wprintf 函数一起使用时,指定宽字符字符串。 将于第一个空字符之前或达到精度值时显示字符。 |
S | String | 与 printf 函数一起使用时,指定宽字符字符串;与 wprintf 函数一起使用时,指定单字节或多字节字符串。 将于第一个空字符之前或达到精度值时显示字符。 |
Z | ANSI_STRING 或 UNICODE_STRING 结构 | 将 或 结构的地址作为参数传递时,显示结构字段指向的缓冲区 Buffer 中包含的字符串。 使用 大小 修饰符前缀 来指定 UNICODE_STRING 例如的参数 —%wZ 。 结构的 Length 字段必须设置为字符串的长度(以字节为单位)。 结构的 MaximumLength 字段必须设置为缓冲区的长度(以字节为单位)。 通常, Z 只能在使用转换规范的驱动程序调试函数(如和)中使用类型字符 dbgPrint``kdPrint 。 |
3.3标志字符
标志 | 含义 | 默认 |
---|---|---|
- | 在给定的字段宽度内左对齐结果。 | 右对齐。 |
+ | 如果输出值为有符号类型,请使用符号 (+ 或-) 为其加上前缀。 | 只对有符号的负值 (-) 显示符号。 |
0 | 如果 width 的前缀为 ,则将添加前导零,直到达到最小宽度。 如果 0 和都 - 出现, 0 则忽略。 如果 0 为整数格式指定了, (、、、、 i u x X o 、 d ) 和精度规范也存在,则 —%04.d —0 将忽略。 如果 0 为 a 或浮点格式指定了,则在 A 或前缀之后为尾数预置前导零 0x``0X 。 | 不填充。 |
空白 ( “” ) | 如果输出值已签名且为正值,则使用空值作为其前缀。 如果空白和 + 标志同时出现,空白则将被忽略。 | 没有显示空白。 |
# | 当它与 o 、或格式一起使用时 x ****X ,标志将 # 分别使用 0 、 0x 或 0X ,以作为任何非零输出值的前缀。 | 不显示前缀。 |
当它与 e 、 E 、、、或格式一起使用时 f F a ****A ,标志将 # 强制输出值包含小数点。 | 仅当小数点后紧跟数字时,才会显示小数点。 | |
当它与或格式一起使用时 g ****G , # 标志将强制输出值包含小数点,并防止截断尾随零。 与 c 、、 d ****i 、 u 或一起使用时,将被忽略 s 。 | 仅当小数点后紧跟数字时,才会显示小数点。 尾随零将被截断。 |
3.4精度值如何影响类型
类型 | 含义 | 默认 |
---|---|---|
a , A | 精度指定此点后的数字位数。 | 默认精度为 13。 如果精度为 0,除非使用 # 标志,否则不会打印小数点。 |
c , C | 精度不产生任何影响。 | 打印字符。 |
d , i , o , u , x , X | 精度指定要打印的最小数字位数。 如果参数中的数字位数小于精度,则将在输出值的左侧使用零进行填充。 当位数超过 精度时,该值不会被截断。 | 默认精度为 1。 |
e , E | 精度指定此小数点后要打印的数字位数。 打印的最后一位数舍入。 | 默认精度为 6。 如果 精度 为0,或者该时间段 () 出现时不包含数字,则不会打印小数点。 |
f , F | 精度值指定此小数点后的数字位数。 如果出现小数点,则在它之前至少会显示一个数字。 该值舍入为适当数量的数字。 | 默认精度为 6。 如果 精度 为0,或者如果句点 () 出现时没有数字,则不会打印小数点。 |
g , G | 精度指定打印的最大有效位数。 | 打印六个有效位数,并且任何尾随零都会被截断。 |
s , S | 精度指定要打印的最大字符数。 不会打印超过精度的字符。 | 输出字符,直到找到空字符。 |
3.5printf 和 wprintf 格式类型说明符的大小前缀
若要指定 | 使用前缀 | 及类型说明符 | 备注 |
---|---|---|---|
char unsigned char | hh | d 、i 、o 、u 、x 或 X | |
short int short unsigned int | h | d 、i 、o 、u 、x 或 X | |
__int32 unsigned __int32 | I32 | d 、i 、o 、u 、x 或 X | 非标函数 |
__int64 unsigned __int64 | I64 | d 、i 、o 、u 、x 或 X | 非标函数 |
intmax_t uintmax_t | j 或 I64 | d 、i 、o 、u 、x 或 X | 非标函数 |
long double | l (小写 L) 或 L | a 、A 、e 、E 、f 、F 、g 或 G | |
long int long unsigned int | l (小写 L) | d 、i 、o 、u 、x 或 X | |
long long int unsigned long long int | ll (小写的 LL) | d 、i 、o 、u 、x 或 X | |
ptrdiff_t | t 或 I (大写 i) | d 、i 、o 、u 、x 或 X | 非标函数 |
size_t | z 或 I (大写 i) | d 、i 、o 、u 、x 或 X | |
单字节字符 | h | c 或 C | |
宽字符 | l (小写 L) 或 w | c 或 C | |
单字节字符串 | h | s 、S 或 Z | |
宽字符字符串 | l (小写 L) 或 w | s 、S 或 Z |
ptrdiff_t
和 size_t
类型在 32 位平台上为 __int32
或 unsigned __int32
,在 64 位平台上为 __int64
或 unsigned __int64
。 I
(大写 i) 、、 j
****t
和 z
大小前缀采用平台的正确参数宽度。
在 Visual C++ 中,虽然 long double
是互异的类型,但是它具有与 double
相同的内部表示形式。
**hc
**或 hC
类型说明符与 c
函数中的 printf
和函数中的 C
同义 wprintf
。 lc
、 lC
、 wc
或类型说明符与函数中的 wC
****C
printf
和函数的同义词 c
wprintf
。 **hs
**或 hS
类型说明符与 s
函数中的 printf
和函数中的 S
同义 wprintf
。 ls
、 lS
、 ws
或类型说明符与函数中的 wS
****S
printf
和函数的同义词 s
wprintf
。
备注
特定于 Microsoft 的:
I
(大写 i) ,, I32
, I64
和 w
参数大小修饰符前缀是 Microsoft 扩展,不与 ISO C 兼容。 当与类型的数据一起使用时, h
前缀为类型的数据,而与类型的数据一起使用时,则使用前缀 char
" l
(小写") 前缀 double
。
3.6代码示例
//使用scanf和printf编写程序按以下格式输入保存到变量并且显示(在代码下面用注释写上格式的作用)
//1.cC
//c 字符 与 printf 函数一起使用时,指定单字节字符;与 wprintf 函数一起使用时,指定宽字符。
//c 字符。 与 scanf 函数结合使用时,指定单字节字符;与 wscanf 函数结合使用时,指定宽字符。
char ch = 0;
printf("Please Input character:");
scanf_s("%c", &ch,1);
printf("ch = %c\n", ch);
//C 字符 与 printf 函数一起使用时,指定宽字符;与 wprintf 函数一起使用时,指定单字节字符。
//C 相反大小字符。 与 scanf 函数结合使用时,指定宽字符;与 wscanf 函数结合使用时,指定单字节字符。
wchar_t wc=0;
printf("Please Input character:");
scanf("%C", &wc);
printf("wc = %C\n", wc);
// 2.d
//d Integer 带符号十进制整数。
int nNumber = 0;
printf("Please Input Number:");
scanf_s("%d", &nNumber);//输入带符号十进制整数
printf("nNumber = %d\n", nNumber);//输出带符号十进制整数
// 3.i
//scanf->i { 1 }一个整数。{ 2 } 如果输入字符串以“0x”或“0X”开始,则为十六进制;
//如果字符串以“0”开始,则为八进制;其余情况为十进制。
//printf-> i Integer 带符号十进制整数。
int nNumber3 = 0;
printf("Please Input Number:");
scanf_s("%i", &nNumber3);
printf("nNumber3 = %i\n", nNumber3);
// 4.o
//scanf->o 八进制整数。
//printf->o 无符号八进制整数。
int nNumber4 = 0;
printf("Please Input Number:");
scanf_s("%o", &nNumber4);//输入八进制整数
printf("八进制nNumber4 = 0%o\n", nNumber4);//输出无符号八进制整数
// 5.u
//u Integer 无符号十进制整数。
int nNumber5 = 0;
printf("Please Input Number:");
scanf_s("%u", &nNumber5);//输入无符号十进制整数
printf("无符号十进制整数nNumber5 = %u\n", nNumber5);//输出无符号十进制整数
// 6.xX
//x 十六进制整数。 指向 int的指针。
//printf-> x 无符号十六进制整数; 使用 " abcdef "。
//printf-> X 无符号十六进制整数; 使用 " ABCDEF "。
int nNumber6 = 0;
printf("请输入十六进制整数:");
scanf_s("%x", &nNumber6);//输入带符号十六进制整数
printf("nNumber6 = %x\n", nNumber6);//输出无符号十六进制整数; 使用 " abcdef "。
int nNumber6_2 = 0;
printf("请输入十六进制整数:");
scanf_s("%X", &nNumber6_2);//输入十六进制整数
printf("nNumber6_2 = %X\n", nNumber6_2);//输出无符号十六进制整数; 使用 " ABCDEF "。
// 7.eE
//e 格式为 [-] e± [ ]的有签名值,其中 是一个十进制数字,是一个或多个十进制数字,具体取决于指定的精度,
//或者默认为六位 d.ddddd.dddddddddddddd ,
//[ d ]dd是两个或三个十进制数字,具体取决于输出格式和指数的大小。
float nNumber7_1 = 0;
printf("请输入浮点数:");
scanf_s("%e", &nNumber7_1);//输入浮点数
printf("nNumber7_1 = %e\n", nNumber7_1);//输出的浮点型为科学记数法
//E 同上e,格式为 [-] E± [ ]的有签名值
float nNumber7_2 = 0;
printf("请输入浮点数:");
scanf_s("%E", &nNumber7_2);//输入浮点数
printf("nNumber7_2 = %E\n", nNumber7_2);//输出的浮点型为科学记数法
// 8.fF
//f 浮点 格式为 [-] .的有签名值 dddddddddddd , dddd 其中 是一个或多个十进制数字。
//小数点前的数字位数取决于数字的度量值,小数点后的数字位数取决于请求的精度,或为默认的六位数。
float nNumber8_1 = 0;
printf("请输入浮点数:");
scanf_s("%f", &nNumber8_1);//输入浮点数
printf("nNumber8_1 = %f\n", nNumber8_1);//
//F 浮点 与 格式相同 f
float nNumber8_2 = 0;
printf("请输入浮点数:");
scanf_s("%F", &nNumber8_2);//输入浮点数
printf("nNumber8_2 = %F\n", nNumber8_2);//
// 9.gG
//g 浮点 有签名值以 f 或 e 格式显示,以更精简的给定值和精度为准。
// 只有当值的指数小于 -4 或大于或等于精度参数时,才 e 使用 e 。
// 截去尾随零,仅当后跟一个或多个数字时,才会显示小数点。
float nNumber9_1 = 0;
printf("请输入浮点数:");
scanf_s("%g", &nNumber9_1);//输入浮点数
printf("nNumber9_1 = %g\n", nNumber9_1);//根据数的进度大小输出科学计数法或者普通计数法
float nNumber9_2 = 0;
printf("请输入浮点数:");
scanf_s("%G", &nNumber9_2);//输入浮点数
printf("nNumber9_2 = %G\n", nNumber9_2);//根据数的进度大小输出科学计数法(E表示)或者普通计数法
// 10.aA
//a 浮点 采用[-]0xh.hhhhp±格式的有签名十六进制双精度浮点值,
// 其中 h.hhhh是十六进制数字(使用小写字母) 作为指数的一个或多个数字。 精度指定此点后的数字位数。
float nNumber10_1 = 0;
printf("请输入浮点数:");
scanf_s("%a", &nNumber10_1);//输入浮点数
printf("nNumber10_1 = %a\n", nNumber10_1);//采用[-]0xh.hhhh p±格式输出
//A 浮点 采用[-]0Xh.hhhhP±格式的有签名十六进制双精度浮点值,其中 h.hhhh是十六进制数字 (使用大写字母) 表示指数,
//dd是指数的一个或多个数字。 精度指定此点后的数字位数。
float nNumber10_2 = 0;
printf("请输入浮点数:");
scanf_s("%A", &nNumber10_2);//输入浮点数
printf("nNumber10_2 = %A\n", nNumber10_2);//采用[-]0xh.hhhh P±格式输出
// 11.n
//printf -> n 目前成功写入流或缓冲区的字符数。
//scanf -> n 未从流或缓冲区读取任何输入
int val;
val = _set_printf_count_output(1);
printf("hello %n world\n", &val);//printf目前成功写入流或缓冲区的字符数 val=6
printf("val = %d\n", val);
int k;
scanf_s("%d%n",&k, &val);//val= (输入的整数k的位数)
printf("%d\n", val);
// 12.p
//p 以十六进制数字显示参数作为地址
int nNumber12 = 0;
printf("请输入一个数:");
scanf_s("%d", &nNumber12);
printf("nNumber12 = %p", nNumber12);//以十六进制输出
// 13.sS
//s String 与 printf 函数一起使用时,指定单字节或多字节字符串;与 wprintf 函数一起使用时,指定宽字符字符串。
//S String 与 printf 函数一起使用时,指定宽字符字符串;与 wprintf 函数一起使用时,指定单字节或多字节字符串。
char str[255];
printf("请输入字符串:");
scanf("%s", str);
printf("str = %s\n", str);
char str1[128];
printf("请输入字符串:");
wscanf(L"%S", str1);
wprintf(L"str = %S\n", str1);
// 14.Z
// Z ANSI_STRING 或 UNICODE_STRING 结构 将 或 结构的地址作为参数传递时,显示结构字段指向的缓冲区 //ANSI_STRINGUNICODE_STRINGBuffer 中包含的字符串。 使用 大小 修饰符前缀 来指定 UNICODE_STRING 例如的参数 —%wZ 。
//结构的 Length 字段必须设置为字符串的长度(以字节为单位)。
// 结构的 MaximumLength 字段必须设置为缓冲区的长度(以字节为单位)。
//不会用
// 15. -
//- 在给定的字段宽度内左对齐结果。
char str15[222] = "ABCDEF";
printf("请输入一个字符串:");
scanf_s("%s", str15);
printf("%-10s\n", str15);
// 16. +
//+ 如果输出值为有符号类型,请使用符号(+或 - ) 为其加上前缀。
char str16[222] = "ABCDEF";
printf("请输入一个字符串:");
scanf_s("%s", str16);
printf("%+20s\n", str16);
// 17.0
// 0:有0表示指定空位填0,如省略表示指定空位不填。
int nNumber17=0;
printf("请输入一个数字:");
scanf_s("%d", &nNumber17);
printf("nNumber17 = %010d\n", nNumber17);
// 18.#
//当它与 o 、或格式一起使用时 xX ,标志将 # 分别使用 0 、 0x 或 0X ,以作为任何非零输出值的前缀。
int nNumber17 = 0;
printf("请输入一个数字:");
scanf_s("%d", &nNumber17);
printf("nNumber17 = %#8d\n", nNumber17);
printf("nNumber17 = %#8o\n", nNumber17);
printf("nNumber17 = %#8x\n", nNumber17);
// 20.hh
//hh 读取一个字节的数据,长了就会截断,舍弃高位
// char 的范围是 -127 - 0 -128
char ch20;
printf("请输入一个字符:");
scanf_s("%hhd", &ch20);
printf("ch20 = %hhd ", ch20);
// 21.h
//h 读取2个字节的数据,长了就会截断,舍弃高位
//short 的范围是 -32768 - 0 - 32767
short nNumber21 = 0;
printf("请输入一个数字:");
scanf_s("%hd", &nNumber21);
printf("nNumber21 = %hhd ", nNumber21);
// 22.I32
//I32 读取4个字节的数据,长了就会截断,舍弃高位
//int 的范围是 -2147483648 - 0 - 2147483647
int nNumber22 = 0;
printf("请输入一个数字:");
scanf_s("%I32d", &nNumber22);
printf("nNumber22 = %I32d \n", nNumber22);
printf("nNumber22 = %I32x \n", nNumber22);
// 23.I64
//I64 读取8个字节的数据,长了就会截断,舍弃高位
//long long 的范围是 -9223372036854775808 -0 - 9223372036854775807
char num[256] = { NULL };
printf("请输入一个数字:");
scanf_s("%llx", num);
printf("nNumber23 = %I64d\n", num);
printf("nNumber23 = %I64x\n", num);
// 24.j
//j 读取8个字节的数据,长了就会截断,舍弃高位
//的范围是 -9223372036854775808 -0 - 9223372036854775807
long long int nNumber24 = 9223372036854775809;
printf("请输入一个数字:");
scanf_s("%jd", &nNumber24);
printf("nNumber24 = %jd\n", nNumber24);
printf("nNumber24 = %jx\n", nNumber24);
// 25.l(小写的 L)或 L
//long double l (小写 L) 或 L + a、A、e、E、f、F、g 或 G
long double nNumber25 = 0;
printf("请输入一个数字:");
scanf_s("%le", &nNumber25);
printf("nNumber25 = %le\n", nNumber25);
printf("nNumber25 = %lg\n", nNumber25);
// 26.ll(小写的 LL)
long long int nNumber26 = 0;
printf("请输入一个数字:");
scanf("%lld", &nNumber26);
printf("nNumber26 = %lld\n", nNumber26);
printf("nNumber26 = %llx\n", nNumber26);
// 27.t 或 I(大写的 i)
//typedef int ptrdiff_t
//ptrdiff_t 的范围是 -2147483648 - 0 - 2147483647
ptrdiff_t nNumber27 = 0;
printf("请输入一个数字:");
scanf("%td", &nNumber27);
printf("nNumber27 = %td\n", nNumber27);
printf("nNumber27 = %tx\n", nNumber27);
printf("nNumber27 = %id\n", nNumber27);
printf("nNumber27 = %ix\n", nNumber27);
printf("nNumber27 = %Id\n", nNumber27);
printf("nNumber27 = %Ix\n", nNumber27);
// 28.z 或 I(大写的 i)
//typedef unsigned int size_t;
//size_t 0- 4294967295
size_t nNumber28 = 0;
printf("请输入一个数字:");
scanf("%tu", &nNumber28);
printf("nNumber28 = %tu\n", nNumber28);
printf("nNumber28 = %tu\n", nNumber28);
printf("nNumber28 = %Iu\n", nNumber28);
printf("nNumber28 = %Iu\n", nNumber28);
printf("nNumber28 = %iu\n", nNumber28);
printf("nNumber28 = %iu\n", nNumber28);
// 29.l(小写的 L)或 w
//宽字符字符串 l (小写 L) 或 w s、S 或 Z
wchar_t ch29[222] = {0};
printf("请输入一个字符串:");
wscanf(L"%ls", ch29);
wprintf(L"ch29 = %ls\n", ch29);
wchar_t ch29_2[222] = { 0 };
printf("请输入一个字符串:");
wscanf(L"%Ls", ch29_2);
wprintf(L"ch29 = %Ls\n", ch29_2);
wchar_t ch29_3[222] = { 0 };
printf("请输入一个字符串:");
wscanf(L"%ws", ch29_3);
wprintf(L"ch29 = %ws\n", ch29_3);