zoukankan      html  css  js  c++  java
  • C Primer Plus学习笔记(三)- 字符串和格式化输入/输出

    从一个简单的例子开始

    #include <stdio.h>
    
    int main()
    {
    	char name[10];
    
    	printf("Input Your Name:
    ");
    	scanf("%s", name);
    	printf("Your Name is %s
    ", name);
    
    	return 0;
    }
    

    运行结果

    C语言没有专门用于储存字符串的变量类型,字符串都被储存在char类型的数组中

    数组由连续的存储单位组成,字符串中的字符被储存在相邻的存储单元中,每个单元储存一个字符

    字符串末尾有个空字符,C语言用它标记字符串的结束,空字符是非打印字符,ASCII码值为0

    C语言中的字符串一定以空字符结尾,所以数组的容量必须至少比待存储字符串中的字符数少1

    如,声明一个20个存储单位的字符串,它只能存储19个字符,剩下一个字节留给空字符

    编译器会在字符串末尾加上空字符

    字符串和字符:

    字符串用""括起来,字符用''括起来

    字符是基本类型(char),字符串是派生类型(char 数组)

    字符串由字符和空字符组成

    strlen()函数:

    string.h头文件中包含strlen()函数和其他多个与字符串相关的函数原型

    strlen()函数给出字符串中的字符长度,不把空字符算入,但包括空格和标点符号,sizeof把字符串结尾的空字符也算入

    strlen()函数占位符用%zd,如果编译器不识别%zd,就用%u或%lu

    定义常量:

    格式:#define 符号常量名 常量的值

    #define NAME jack
    

    末尾不用加分号

    符号常量的命名规则和变量相同,常量名最好用大写

    const限定符:

    const关键字用于限定一个变量为只读,也就是只能使用,不能修改

    const char name = 'Jack';
    

    name变成了只读的变量

    转换说明及其打印的输出结果

    转换说明 输出
    %a 浮点数、十六进制数和p记数法(C99/C11)
    %A 浮点数、十六进制数和p记数法(C99/C11)
    %c 单个字符
    %d 有符号十进制整数
    %e 浮点数,e记数法
    %E 浮点数,e记数法
    %f 浮点数,十进制记数法
    %g 根据值的不同,自动选择%f或%e。%e格式用于指数小于-4或者大于或等于精度时
    %G 根据值的不同,自动选择%f或%E。%E格式用于指数小于-4或者大于或等于精度时
    %i 有符号十进制整数(和%d相同)
    %o 无符号八进制整数
    %p 指针
    %s 字符串
    %u 无符号十进制整数
    %x 无符号十六进制整数,使用十六进制数0f
    %X 无符号十六进制整数,使用十六进制数0F
    %% 打印一个百分号

    格式字符串中的转换说明一定要与后面的每个项相匹配

    printf()中的标记

    标记 含义
    - 待打印项左对齐
    + 有符号值若为正,则在值前面显示加号;若为负,则在值前面显示减号
    空格 有符号值若为正,则在值前面显示前导空格(不显示任何符号);若为负,则在值前面显示减号+标记覆盖一个空格
    # 把结果转换为另一种格式。如果是%o格式,则以0开始;如果是%x或%X格式,则以0x或0X开始;对于所有的浮点格式,#保证了即使后面没有任何数字,也打印一个小数点字符。对于%g和%G格式,#防止结果后面的0被删除
    0 对于数值格式,用前导0代替空格填充字段宽度。对于整数格式,如果出现-标记或指定精度,则忽略该标记

     示例

    #include <stdio.h>
    
    int main()
    {
    	char one_size = 'M';
    	int two_num = 13;
    	int three_num = -15;
    	int four_num = 124;
    	int five_num = 25;
    
    	printf("*%-20c*
    ", one_size);
    	printf("*%+d*
    ", two_num);
    	printf("*% d*
    ", three_num);
    	printf("*%#x*
    ", four_num);
    	printf("*%010d*
    ", five_num);
    
    	return 0;
    }
    

    运行结果

    printf()的转换说明修饰符

    修饰符 含义
    标记 上表
    数字 最小字段宽度,如果该字段不能容纳待打印的数字或字符串,系统会使用更宽的字段
    .数字

    精度。
    对于%e,%E和%f转换,表示小数点右边数字的位数

    对于%g和%G转换,表示有效数字最大位数

    对于%s转换,表示待打印字符的最大数量

    对于整型转换,表示待打印数字的最小位数

    如有必要,使用前导0来达到这个位数

    只使用.表示其后跟随一个0,所以%.f和%.0f相同

    h 和整型转换说明一起使用,表示short int或unsigned short int类型的值
    hh 和整型转换说明一起使用,表示signed char或unsigned char类型的值
    j 和整型转换说明一起使用,表示intmax_t或uintmax_t类型的值。这些类型定义在stdint.h中
    l 和整型转换说明一起使用,表示long int或unsigned long int类型的值
    ll 和整型转换说明一起使用,表示long long int或unsigned long long int类型的值
    L 和浮点转换说明一起使用,表示long double类型的值
    t 和整型转换说明一起使用,表示ptrdiff_t类型的值。ptrdiff_t是两个指针差值的类型
    z 和整型转换说明一起使用,表示size_t类型的值。size_t是sizeof返回的类型

     对于浮点类型有用于double和long double类型的转换说明,却没有float类型的,这是因为无论在K&R C还是ANSI C,float类型被自动转换成double类型,所以都没有显示float类型值专用的转换说明

    转换说明把以二进制格式储存在计算机中的值转换成一系列字符(字符串)以便于显示

    printf()函数的返回值:

    printf()函数也有一个返回值,它返回打印字符的个数

    如果有输出错误,printf()则返回一个负值

    #include <stdio.h>
    
    int main(void)
    {
    	int rev;
    	rev = printf("Hello World!
    ");
    	printf("%d
    ", rev);
    
    	return 0;
    }
    

    运行结果

    参数传递:

    程序把传入的值放入被称为栈的内存区域

    计算机根据变量类型(不是根据转换说明)把这些值放入栈中

    printf()函数根据转换说明(不是根据变量类型)从栈中读取值

    scanf()函数:

    如果用scanf()读取基本变量类型的值,在变量名前加上一个&

    如果用scanf()把字符串读入字符数组中,不用&

    从scanf()角度看输入:

    如果scanf()使用%d转换说明读取一个整数,scanf()函数每次读取一个字符,跳过所有的空白字符,直到遇到第1个非空白字符才开始读取

    scanf()函数如果找到一个数字或符号(+或-),它便保存该字符,并读取下一个字符。

    如果下一个字符是数字,它就保存该字符并读取下一个字符。

    scanf()会不断地读取和保存字符,直到遇到非数字字符。

    如果遇到非数字符号,scanf()就认为读到了整数的末尾。

    然后,scanf()就把非数字字符放回输入,程序在下一次读取输入的时候,首先会读取丢弃的非数字字符。

    最后,scanf()计算已读取数字(可能还有符号)相应的数值,并将计算后的值放入指定的变量中

    如果使用字段宽度,scanf()会在字段结尾或第一个空白字符处停止读取

    使用%s转换说明,scanf()只能读取一个不包含空白字符的单词,无法利用字段宽度让只有一个%s的scanf()读取多个单词

    当scanf()把字符串放进指定数组中时,它会在字符序列的末尾加上空字符,让数组中的内容成为一个C字符串

    scanf()函数所用的转换说明与printf()函数几乎相同。主要区别是,对于float类型和double类型,printf()都使用%f,%e,%E,%g和%G转换说明,而scanf()只把它们用于float类型,对于double类型要使用l修饰符

    scanf()的返回值:

    scanf()函数返回成功读取的项数

    如果没有读取任何项,且需要读取一个数字而用户却输入一个非数值字符串,scanf()便返回0

    当scanf()检测到“文件结尾”时,会返回EOF(EOF是stdio.h中定义的特殊值,通常用#define指令把EOF定义为-1)

    scanf()的*修饰符:

    把*放在%和转换字符之间时,会使得scanf()跳过相应的输出项

    #include <stdio.h>
    
    int main(void)
    {
    	int n;
    
    	printf("Input Three integers
    ");
    	scanf("%*d, %*d, %d", &n);
    	printf("The Last Interger is %d
    ", n);
    
    	return 0;
    }
    

    运行结果

  • 相关阅读:
    278.First Bad Version
    277. Find the Celebrity
    256.Paint House
    276. Paint Fence
    275. H-Index II
    274. H-Index
    273. Integer to English Words
    272. Closest Binary Search Tree Value II
    270. Closest Binary Search Tree Value
    271. Encode and Decode Strings
  • 原文地址:https://www.cnblogs.com/sch01ar/p/8682795.html
Copyright © 2011-2022 走看看