参考书:《C Primer Plus》第六版
-
C语言没有专门用来存储字符串的变量类型,字符串被存储在变量类型的数组中。该数组末尾位置的字符为空字符
\0
,C语言用它来标记字符串的结束。空字符是非打印字符,ASCII码值是0。 -
用
%s
来告诉printf()打印一个字符串。scanf()在遇到第一个空白(空格、制表符、换行符)时就不再读取输入。其它输入函数如fgets()用于读取一般字符串。(程序清单1)注:在VS中,由于scanf()函数不安全,现在引进不允许使用了,取而代之的是scanf_s()
函数,它是针对–scanf()在堆区字符串时不检查边界,可能造成内存泄漏–这个问题设计的。scanf_s()在读取字符串时必须提供一个数字以表明最多读取多少位字符,以防止溢出。 -
用
strlen()
函数得出字符串中的字符长度,包括空格和标点符号。注意区分strlen()和sizeof。 -
可以用预处理器来定义常量,如
#define TAXRATE 0.015
,编译程序时程序中的所有的TAXRATE都会被替换成0.015,这个过程被称为编译时替换,这样定义的常量也称为明示常量。 -
可以用
const
限定词限定一个变量为只读。 -
limits.h
头文件中的一些明示常量:CHAR_BIT
:char类型的位数、CHAR_MAX
:char类型的最大值、CHAR_MIN
:char类型的最小值、SCHAR_MAX
:signed char类型的最大值、SCHAR_MIN
:signed char类型的最小值、UCHAR_MAX
:unsigned char类型的最大值、UCHAR_MIN
:unsigned char类型的最小值、SHRT_MAX
:short类型的最大值、SHRT_MIN
:short类型的最小值、USHRT_MAX
:unsigned short类型的最大值、USHRT_MIN
:unsigned short类型的最小值、INT_MAX
:int类型的最大值、INT_MIN
:int类型的最小值、UINT_MAX
:unsigned int类型的最大值、LONG_MAX
:long类型的最大值、LONG_MIN
:long类型的最小值、ULONG_MAX
:unsigned long类型的最大值、LLONG_MAX
:long long类型的最大值、LLONG_MIN
:long long 类型的最小值、ULLONG_MAX
:unsigned long long类型的最大值。 -
float.h
头文件中的一些明示常量:FLT_MANT_DIG
:float类型的尾数位数、FLT_DIG
:float类型的最小有效数字位数、FLT _MIN_10_EXP
:带全部有效数字的float类型的最小负指数、FLT_MAX_10_EXP
:float类型的最大正指数、FLT_MIN
:保留全部精度的float类型的最小正数、FLT_MAX
:float类型的最大正数、FLT_EPSILON
:1.00和比1.00大的最小float类型值之间的差值。 -
转换说明 输出 %a 浮点数、十六进制和p计数法 %A 浮点数、十六进制和p计数法 %c 单个字符 %d/%i 有符号十进制整数 %e 浮点数,e计数法 %E 浮点数,e计数法 %f 浮点数,十进制计数法 %g/%G 根据值的不同,自动选择%f或%e %o 无符号八进制整数 %p 指针 %s 字符串 %u 无符号十进制整数 %x/%X 无符号十六进制整数,使用十六进制数0f %% 打印一个百分号 -
修饰符 含义 标记 一共有5种标记(-、+、空格、#和0),可以不使用标记或使用多个标记如 %-10d
数字 最小字段宽度如 %4d
.数字 精度,对于%e、%E和%f转换,表示小数点右边数字的位数;对于%g和%G,表示有效数字最大位数;对于%s,表示待打印字符的最大数量;对于整型转换,表示待打印数字的最小位数;只使用.表示后面跟随个0;如 %5.2f
:打印一个浮点数,字段宽度为5字符,小数点后有两位数字h 和整型转换说明一起使用,表示short int 或unsigned short int类型的值,如 %hu
hh 和整型转换说明一起使用,表示signed char或unsigned char,如 %hhu
j 和整型转换一起使用,表示intmax_t或uintmax_t类型的值,如 %jd
l 和整型转换说明一起使用,表示long int或unsigned int类型的值,如 %ld
ll 和整型装转换说明一起使用,表示long long int 或unsigned long long int类型的值,如 lld
L 和浮点转换说明一起使用,表示long double类型的值,如 Lf
t 和整型转换说明一起使用,表示ptrdiff_t(两个指针差值)类型的值,如 td
z 和整型说明一起使用,表示size_t类型的值,如 %zd
-
标记 含义 - 待打印项左对齐,即从字段的左侧开始打印该项 + 有符号值若为正,则在值前面显示加号,若为负,则在之前面显示减号 空格 有符号值若为正则在值前面显示空格,若为负则在值前面显示减号加标记并覆盖空格 # 把结果转换为另一种形式。如果是%o格式则以0开始,%x或%X格式则以0x或0X开始,对于浮点格式,#保证即使后面没有任何数字也打印一个小数点字符。对于%g和%G格式,#防止结果后面的0被删除 0 对于数值格式,用前导0代替空格填充字段宽度;对于整数格式,如果出现-标记或指定精度,则忽略该标记 -
scanf()函数允许八普通字符放在格式字符串中,除空格字符外的普通字符必须与输入字符串严格匹配。如
scanf("%d,%d,&n,&m");
,必须输入这样的两个整数如:88,121
。scanf()函数返回成功读取的项数。 -
printf()和scanf()都可以用
*
修饰符来修改转换说明的含义。对于printf()函数,可以用*
来代替字段宽度。如%*d
,那么参数列表中应包含*和d对应的值。也可以用它来指定浮点值的精度和字段宽度。如程序清单2。而scanf()中把*放在%和转换字符之间会使得scanf()跳过相应的输入项。如程序清单3。
程序清单1
#include<stdio.h>
#define PRAISE "You are an extraodinary being."
int main(void) {
char name[40]="test";
printf("What's your name?");
scanf_s("%s", &name,40);
//scanf_s("%s", name);s
printf("Hello, %s. %s\n", name, PRAISE);
return 0;
}
输出
What's your name?Hakurei Reimu
Hello, Hakurei. You are an extraodinary being.
C:\Users\xhh\Source\Repos\c_study_1\Debug\c_study_1.exe (进程 14144)已退出,代码为 0。
按任意键关闭此窗口. . .
程序清单2:
#include<stdio.h>
int main(void) {
unsigned width, precision;
int number = 256;
double weight = 242.5;
printf("Enter a field width:\n");
scanf_s("%d", &width);
printf("The number is :%*d:\n", width, number);
scanf_s("%d %d", &width, &precision);
printf("weight=%*.*f\n", width, precision, weight);
printf("Done!\n");
return 0;
}
输出
Enter a field width:
6
The number is : 256:
8 3
weight= 242.500
Done!
C:\Users\xhh\Source\Repos\c_study_1\Debug\c_study_1.exe (进程 13376)已退出,代码为 0。
按任意键关闭此窗口. . .
程序清单3
#include<stdio.h>
int main(void) {
int n;
printf("Please enter three integers:\n");
scanf_s("%*d %*d %d", &n);
printf("The last integer was %d\n", n);
return 0;
}
输出
Please enter three integers:
2018 2019 2020
The last integer was 2020
C:\Users\xhh\Source\Repos\c_study_1\Debug\c_study_1.exe (进程 26892)已退出,代码为 0。
按任意键关闭此窗口. . .
练习:
- 编写一个程序,提示用户输入名和姓,然后以"名,姓"的形式输出。
- 读取一个浮点数,首先以小数点计数法打印,然后以指数计数法打印。
第一题
#include<stdio.h>
int main(void) {
char first_name[30], last_name[30];
printf("Enter your first name:");
scanf_s("%s", first_name, 30);
printf("Enter your last name:");
scanf_s("%s", last_name, 30);
printf("\n%s,%s", first_name, last_name);
return 0;
}
输出
Enter your first name:huihui
Enter your last name:xie
huihui,xie
C:\Users\xhh\Source\Repos\c_study_1\Debug\c_study_1.exe (进程 39016)已退出,代码为 0。
按任意键关闭此窗口. . .
第二题
#include<stdio.h>
int main(void) {
float num;
printf("Enter a float");
scanf_s("%f", &num);
printf("The input is %.1f or %.1e\n", num, num);
printf("The input is %+*.*f or %*.*E", 8, 3, num, 8, 3, num);
return 0;
}
输出
Enter a float21.29
The input is 21.3 or 2.1e+01
The input is +21.290 or 2.129E+01
C:\Users\xhh\Source\Repos\c_study_1\Debug\c_study_1.exe (进程 32876)已退出,代码为 0。
按任意键关闭此窗口. . .