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

一、字符串

字符串是一个或多个字符的序列。如:“Hello World”

双引号不是字符串的一部分。仅告知编译器它括起来的是字符串,正如单引号用于表示单个字符一样。

当用双引号表示字符串时,字符串的末尾默认会有一个"\0"表示字符串的结束。当用字符数组表示字符串时,如果末尾没有"\0",则该数组为字符数组。

#include <stdio.h>

int main() {
    
    

    // 双引号定义的字符串
    char ar1[] = "abc";
    // 字符数组定义的字符串。末尾的\0表示字符串的结束。如果没有\0则表示一个字符数组
    char ar2[] = {
    
    'a', 'b', 'c', '\0'};
    printf("%s\n",ar1);
    printf("%s\n",ar2);

    return 0;
}

#include <stdio.h>
#include <string.h>

int main() {
    
    

    // 双引号定义的字符串
    char ar1[] = "abc";
    // 字符数组定义的字符串。末尾的\0表示字符串的结束。如果没有\0则表示一个字符数组
    char ar2[] = {
    
    'a', 'b', 'c'};
    printf("%s\n",ar1);
    printf("%s\n",ar2);
    // strlen函数为统计字符串的长度,统计\0之前的字符。
    printf("%llu\n", strlen(ar1));
    // 输出随机值,直到遇到\0才会输出
    printf("%llu\n", strlen(ar2));

    return 0;
}

1.1 char类型数组和null字符

C语言没有专门用于存储字符串的变量类型,字符串都被存储在char类型的数组中。数组由连续的存储单元组成,字符串中的字符都被存储在相邻的存储单元中,每一个存储单元存储一个字符。

在这里插入图片描述
在数组末尾的位置的字符"\0"。是空字符(null character),C语言用它标记字符串的结束。空字符不是数字0,它是非打印字符,其ASCII码值是0。

C中的字符串一定以空字符结束,这意味着数组的存储容量必须至少比待存储字符串中的字符数多1。可以把数组看作是一行连续的多个存储单元。用更正式的说法是,数组是同类型数据元素的有序序列。

char str[40];

上述程序声明了一个包含40个存储单元(或元素)的数组,每个存储单元储存一个char类型的值。str后面的方括号表明这是一个数组,方括号中的数字表示该数组的元素数量,char表命每个元素的类型。

1.2 字符串和字符

字符串常量(例如 " X ")字符常量(’ X ') 不同,区别之一在于字符常量是基本类型(char),而字符串是派生类型(char数组);区别之二是 “X” 实际上是由两个字符组成:'X’和空字符\0。

二、 输入

2.1 scanf()作用

C库包含了多个输入函数,scanf()是最通用的一个,因为它可以读取不同格式的数据。scanf()和printf()类似,也使用格式字符串和参数列表。scanf()函数使用了指向变量的指针(后面会详解指针)。

使用scanf()的两条规则:

1、如果用scanf()读取基本变量类型的值,在变量名前加上一个 “&”。
2、如果使用scanf()把字符串读入字符数组中,不要使用 “&”。

2.2 两种用法

1、scanf("输入控制符",输入参数);
作用:将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中。
#include <stdio.h>

int main() {
    
    

	int num;

	printf("Please enter a number:\n");
	scanf_s("%d", &num);
	printf("输入的数字为:%d", num);

	return 0;

}
2、scanf("非输入控制符 输入控制符",输入参数);
作用:将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中,非输入控制符必须完全输入。
#include <stdio.h>

int main() {
    
    

	int num;

	printf("Please enter a number:\n");
	// ABC为非输入控制符,在进行输入时也必须加上ABC
	scanf_s("ABC%d", &num);
	printf("输入的数字为:%d", num);

	return 0;

}

三、输出

3.1 printf()

请求printf()函数打印数据的指令要与待打印数据的类型相匹配。例如打印整数要用%d,打印字符使用%c。这些符号被称为转换说明,他们指定了如何把数据转换成可显示的形式。

3.1.1 printf 四种用法

1、printf("字符串")
#include <stdio.h>

int main() {
    
    

	// 输出字符串
	printf("Hello world");

	return 0;
}
2、printf("输出控制符",输出参数)
#include <stdio.h>

int main() {
    
    

	int num = 123;
	// 输出变量的值
	printf("%d",num);

	return 0;
}
3、printf("输出控制符1 输出控制符2 ...",输出参数1,输出参数2...)。输出控制符和输出参数必须对应。
#include <stdio.h>

int main() {
    
    

	int num = 123;
	char ch = 'A';
	// 输出变量的值
	printf("%d %c",num, ch);

	return 0;
}
4、printf("输出控制符 非输出控制符",输出参数)
#include <stdio.h>

int main() {
    
    

	int num = 123;
	char ch = 'A';
	// is char为非输出控制符
	printf("%d %c is char",num, ch);

	return 0;
}

3.1.2 常用输出控制符

转换说明 输出
%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
%% 打印一个百分号

3.1.3 printf()的转换说明修饰符

在%和转换字符之间插入修饰符可修饰基本的转换说明。下面的两个表列出了可作为修饰符的合法字符。如果要插入多个字符,其书写顺序应该与表printf()的修饰符的顺序相同,不是所有的组合都可行。表中有些字符是C99新增的,如果编译器不支持C99,则可能不支持表中的所有项。

printf()的修饰符

修饰符 含义
标记 printf()标记描述了5中标记(-、+、空格、#和0),可以不使用标记或使用多个标记。示例:“%-10d”
数字 最小字段宽度,如果该字段不能容纳待打印的数字或字符串,系统会使用更宽的字段。示例:“%4d”
. 数字 精度。对于%e、%E和%f转换,表示小数点右边数字的位数。对于%g和%G转换,表示有效数字最大位数。对于%s转换,表示待打印字符的最大数量。对于整型转换,表示待打印数字的最小位数。如有必要,使用前导0来达到这个位数。只使用 . 表示后跟一个0,所以%.f和%.0f相同。示例:"%5.2f"打印一个浮点数,字段宽度为5字符,其中小数点后有两位数字。
h 和整型转换说明一起使用,表示short int或unsinged short int类型的数值。示例:“%hu”、 “%6.4hd”
hh 和整型转换说明一起使用,表示singed char或unsinged char类型的值。示例:“%hhu” 、“%6.4hhd”
j 和整型转换说明一起使用,表示intmax_t或uintmax_t类型的值,这些类型定义在stdint.h中。示例:“%jd” 、“%8jx”
l 和整型转换说明一起使用,表示long int或unsinged long int类型的值。示例:“%ld” 、“%8lu”
ll 和整型转换说明一起使用,表示long long int 或unsinged long long int类型的值(C99)。示例:“%lld” 、“%6llu”
L 和浮点转换说明一起使用,表示long double类型的值。示例:“%Ld”、“%10.4Le”
t 和整型转换说明一起使用, 表示ptrdiff_t类型的值。ptrdiff_t是两个指针差值的类型(C99)。示例:“%td”、“%l2ti”
z 和整型转换说明一起使用,表示size_t类型的值。size_t是sizeof返回的类型(C99)。示例: “%zd”、“%l2zd”

printf()中的标记

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

#define PAGE 668
int main() {
    
    


    printf("*%d*\n", PAGE);
    printf("*%2d*\n", PAGE);
    printf("*%10d*\n", PAGE);
    printf("*%-10d*\n", PAGE);
    return 0;
}

输出结果:
*668*
*668*
*       668*
*668       *
#include <stdio.h>

#define PAGE 3852.99
int main() {
    
    


    printf("*%f*\n", PAGE);
    printf("*%e*\n", PAGE);
    printf("*%4.2f*\n", PAGE);
    printf("*%3.1f*\n", PAGE);
    printf("*%10.3f*\n", PAGE);
    printf("*%10.3E*\n", PAGE);
    printf("*%+4.2f*\n", PAGE);
    printf("*%010.2f*\n", PAGE);
    return 0;
}
输出结果:
*3852.990000*
*3.852990e+03*
*3852.99*
*3853.0*
*  3852.990*
* 3.853E+03*
*+3852.99*
*0003852.99*

3.1.4 为什么需要输出控制符

1、0和1组成的代码可以表示数据也可以表示指令。
2、如果0和1组成的代码表示的是数据的话,那么同样的0和1代码组合以不同的输出格式输出就会有不同的输出结果。

猜你喜欢

转载自blog.csdn.net/qq_46292926/article/details/127550588