C语言输入输出函数以及字符串处理

前言

这篇是我之前做题的过程中整理的一些关于C语言的输入输出函数的使用细节,以及一些C字符串的处理函数使用。熟悉这些知识可以在写编程题的过程中提高代码的运行效率,实现一些特定的题目要求格式。在不需要使用C++类作为输入输出对象的情况下,使用stdio要比iostream的速度要快很多,所以尽量应使用stdio的输入输出函数。同时对于字符处理,在不是用string的情况下字符数组也有很多方便的处理函数。

printf()函数

printf()常用的转换说明符

在做1052的过程中我就发现了printf()用在处理格式化的输出上会使其变得极其简单,而不需要自己还去写一个格式输出的函数。

  1. %d :有符号十进制整数
  2. %c :一个字符
  3. %e / %E :浮点数的e / E科学计数法
  4. %f :浮点数的十进制计数法
  5. %s :字符串
  6. %% : 打印百分号
  7. %o :无符号八进制整数
  8. %x / %X :无符号十六进制用0f / 0F的(大小写)整数
  9. %u :无符号十进制整数
  10. %g / %G :根据数值选择%f或者%f或%e / %f或者%E。科学计数法在指数小于-4或者大于等于精度时使用

printf()常用的转换说明符的修饰符

  1. 整数 :表示字段的最小宽度,如果不能容纳就会使用更宽的字段
  2. 小数点 + 整数 :表示小数点保留的位数
  3. l :和整数转换说明符(%d)一起使用,表示long int或者unsigned long int
  4. ll : 和整数转换说明符(%d)一起使用,表示long long int或者unsigned long long int
  5. L :和浮点数转换说明符(%f)一起使用,表示一个long double
  6. t :和整数转换说明符(%d)一起使用,表示ptrdiff_t(指针距离)的值
  7. z : 和整数转化说明符(%d)一起使用,表示size_t(sizeof的返回类型)的值
  8. - :左对齐(因为输出默认是右对齐的)
  9. + :有符号的值如果为正数就会显示加号,负数就会显示负号(默认显示)
  10. 空格 :有符号的值如果为正数就会前面空一格,负数就会显示负号(默认显示)
  11. # :若修饰%o则输出以0开头;若修饰%x或者%X,则以0x或者0X开头;对于所有浮点数,即使没有任何数字也会打印一个小数点,对于%g和%G则防止尾随的灵被删除
  12. 0 :对于所有的数字格式用前导零而不是空格填充字段,如果出现了负号或者指定了精度(对于整数)则忽略该标志

scanf()函数

scanf()常用的转换说明符

基本和printf()一致,多一个%p表示输入的是一个指针

scanf()常用的转换说明符的修饰符

  1. 整数 :在遇到第一个空白字符或者达到这个给定的最大宽度的时候结束输入

scanf()使用的一些注意

  1. 在两个转换说明符中间添加字符:意味着希望读取那两个类型的输入时,中间应该还输入添加的字符,用于格式读入
  2. 除了%c之外的说明符都会自动跳过输入项之前的所有空格,所以对于第一条,两个转换符之间加不加空格都会跳过输入中间的空格。而对于%c,如果前面加一个空格表示读入遇到的第一个非空白字符,而没加的话就会把包括空白字符在内的所有字符都当作读入对象
  3. scanf()的返回值是所有读入项目的个数

关于 * 修饰符在printf()和scanf()中的作用

  1. 在printf()中,* 修饰转换说明符后,则应该在后面的对应变量之前再加一个变量来动态指定限定的最小字段宽度。
  2. 在scanf()中,* 修饰转换说明符后,表明这个位置的输入跳过,进入之后的输入项,用来读入数据时,忽略某些不需要的数据

作者:Anyer Hoy
博客:https://hoyyy.me

C字符串处理函数

使用前应引用cstring

strlen()函数和sizeof运算符

sizeof是以字节为单位给出数据的大小,而strlen()则是以字符为单位给出字符串的长度

getchar()函数和putchar()函数

这两个是定义在的,单独读入和输出每个字符,对于c = getchar()赋值语句本身也可以表示读取的字符本身,可以用于输入判断,如
if(c = getchar()) != 'a'){}

gets()函数(get string)

遇到换行符才会停止,不会包括换行符,并且会在末尾添上一个空字符,但是它不会检查预留存储区是否能够容纳实际输入的数据,所以很不安全。
与scanf()不同的是gets()趋向于获取字符串,一整行,而前者趋向于获取单词

puts()函数 (put string)

puts()接受一个字符串参数的地址,然后输出,不同于printf(),它会自动换行

strcat()函数与strncat()函数 (string concatenation)

strcat()函数会将第二个参数提供的字符串拼接到第一个参数提供的字符串后面
但是如果第一个参数字符串提供的空间不足以容纳第二个字符串,多出来的字符会溢出到相邻的存储单元。
而strncat()函数多了第三个参数用来限定最多允许添加到第一个参数字符串尾部的字符的数目(空字符也算作一个字符)
函数返回的是字符指针类型,指向第一个参数的字符串(被拼接的)

strcmp()函数与strncmp()函数 (string comparison)

如果两个字符串相同则会返回0,而如果前者比后者的字符值小则返回-1,而大则返回1,可以理解为减法,而比较规则是基于ASCII表的,而大写字母是开始于0x41(A)的,小写字母开始于0x61(a)的,所以大写字母比小写字母都会要小。

strcpy()函数和strncpy()函数 (string copy)

由于C中的字符串是无法赋值的,所以这个函数使用来复制第二个参数的字符串给第一个参数,同时函数返回值是第一个参数的字符指针。同时第一个参数不需要指向字符串的开始,可以从后面某个位置开始复制。而安全版也是在第三个参数限制复制过来的字符串的最大长度(空字符也是算的)

sprintf()函数

把几个元素组合成一个字符串的一种途径,第一个参数是输出的目标字符串,而后面则是和printf()函数一样的项目列表。

strstr()函数

返回在第一个参数的字符串中第一次出现第二个参数所指的字符串的位置的指针。也就是查找某个子串第一次出现的位置

cctype头文件

主要用来判断字符是否是某些数值类型,比如isdigit()函数判断是否是一个十进制整数,如果是则返回非零数,不是则返回0。再比如isupper()判断是否是大写,而isspace()判断是否是空格等等
toupper()则返回某个字母的大写
tolower()则返回某个字母的小写
而没有对应大小写时则返回值不发生任何变化