C语言学习(二)字符串和格式化输入、输出

参考书:《C Primer Plus》第六版


  1. C语言没有专门用来存储字符串的变量类型,字符串被存储在变量类型的数组中。该数组末尾位置的字符为空字符\0,C语言用它来标记字符串的结束。空字符是非打印字符,ASCII码值是0。

  2. %s来告诉printf()打印一个字符串。scanf()在遇到第一个空白(空格、制表符、换行符)时就不再读取输入。其它输入函数如fgets()用于读取一般字符串。(程序清单1)注:在VS中,由于scanf()函数不安全,现在引进不允许使用了,取而代之的是scanf_s()函数,它是针对–scanf()在堆区字符串时不检查边界,可能造成内存泄漏–这个问题设计的。scanf_s()在读取字符串时必须提供一个数字以表明最多读取多少位字符,以防止溢出。

  3. strlen()函数得出字符串中的字符长度,包括空格和标点符号。注意区分strlen()和sizeof。

  4. 可以用预处理器来定义常量,如#define TAXRATE 0.015,编译程序时程序中的所有的TAXRATE都会被替换成0.015,这个过程被称为编译时替换,这样定义的常量也称为明示常量

  5. 可以用const限定词限定一个变量为只读。

  6. 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类型的最大值。

  7. 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类型值之间的差值。

  8. 转换说明输出
    %a浮点数、十六进制和p计数法
    %A浮点数、十六进制和p计数法
    %c单个字符
    %d/%i有符号十进制整数
    %e浮点数,e计数法
    %E浮点数,e计数法
    %f浮点数,十进制计数法
    %g/%G根据值的不同,自动选择%f或%e
    %o无符号八进制整数
    %p指针
    %s字符串
    %u无符号十进制整数
    %x/%X无符号十六进制整数,使用十六进制数0f
    %%打印一个百分号
  9. 修饰符含义
    标记一共有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
  10. 标记含义
    -待打印项左对齐,即从字段的左侧开始打印该项
    +有符号值若为正,则在值前面显示加号,若为负,则在之前面显示减号
    空格有符号值若为正则在值前面显示空格,若为负则在值前面显示减号加标记并覆盖空格
    #把结果转换为另一种形式。如果是%o格式则以0开始,%x或%X格式则以0x或0X开始,对于浮点格式,#保证即使后面没有任何数字也打印一个小数点字符。对于%g和%G格式,#防止结果后面的0被删除
    0对于数值格式,用前导0代替空格填充字段宽度;对于整数格式,如果出现-标记或指定精度,则忽略该标记
  11. scanf()函数允许八普通字符放在格式字符串中,除空格字符外的普通字符必须与输入字符串严格匹配。如scanf("%d,%d,&n,&m");,必须输入这样的两个整数如:88,121。scanf()函数返回成功读取的项数。

  12. 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。
按任意键关闭此窗口. . .

练习:

  1. 编写一个程序,提示用户输入名和姓,然后以"名,姓"的形式输出。
  2. 读取一个浮点数,首先以小数点计数法打印,然后以指数计数法打印。

第一题

#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。
按任意键关闭此窗口. . .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值