### C语言函数讲解 #### 一、概述 本篇文章旨在为初学者介绍C语言中的函数基础知识,特别是关于`printf`函数的使用方法及其常见的格式控制字符串。通过几个示例程序来展示如何正确地使用这些函数,并解释一些可能出现的错误及解决方法。 #### 二、`printf`函数详解 `printf`函数是C语言中非常重要的一个函数,主要用于格式化输出数据到标准输出设备(通常是屏幕)。其基本格式如下: ```c printf("<格式控制字符串>", 输出表列); ``` 其中: - **格式控制字符串**:由普通字符和以`%`开始的格式说明组成。普通字符会直接输出,而格式说明则用来指定输出项的输出格式。 - **输出表列**:指待输出的变量列表,各个变量之间需要用逗号`,`分隔。 #### 三、格式控制字符串 1. **普通字符**:除了转义字符之外的所有字符,在输出时都会原样输出。 2. **转义字符**:例如`\n`(换行)、`\t`(水平制表符)等,会被替换为其对应的特殊含义进行输出。 3. **格式说明**:以`%`开头,后跟修饰符(可选)和格式字符,用于指定输出项的数据类型和格式。例如: - `%d`:输出带符号十进制整数。 - `%f`:输出浮点数。 - `%c`:输出单个字符。 #### 四、示例分析 1. **示例1** ```c void main() { int a = 123, b = 234; float x = 11111.11, y = 222222.2; double z = 1999.99; char ch1 = 'A'; printf("Welcome to C world!\n"); printf("a=%d, a=%3d, a=%-5d, a=%5d%%\n", a, a, a, a); printf("a=%d, a=%o, a=%x\n", a, a, a); printf("x=%f, x=%.1f, x=%-10.1f, x=%10.1f\n", x, x, x, x); printf("z=%f, z=%hf\n", z, z); printf("ch1=%c, ch1+32=%c\n", ch1, ch1 + 32); } ``` - **解释**: - `printf("a=%d, a=%3d, a=%-5d, a=%5d%%\n", a, a, a, a);`:输出`a`的不同格式,包括左对齐和右对齐,以及百分比符号。 - `printf("a=%d, a=%o, a=%x\n", a, a, a);`:分别以十进制、八进制和十六进制格式输出`a`的值。 - `printf("x=%f, x=%.1f, x=%-10.1f, x=%10.1f\n", x, x, x, x);`:输出`x`的不同精度和宽度格式。 - `printf("z=%f, z=%hf\n", z, z);`:尝试输出`double`类型的`z`为`float`类型,这会导致精度丢失。 - `printf("ch1=%c, ch1+32=%c\n", ch1, ch1 + 32);`:输出字符`A`和`a`。 2. **示例2** ```c void main() { int a = 123, b = 234; float x = 11111.11, y = 222222.2; double z = 1999.99; char ch1 = 'A'; printf("a=%f\n", a); // 格式说明符中表示的数据类型与输出项的类型不同,且不是字符与整型 printf("z=%d\n", z); // 格式说明符中表示的数据类型与输出项的类型不同,且不是字符与整型 printf("ch1=%c, ch1=%d\n", ch1 + 32, ch1 + 32); printf("a=%d, b=%d\n", a, b); printf("a=%d, b=%d\n", a); // 格式说明符个数多于输出项个数 printf("a=%d\n", a, b); // 格式说明符个数少于输出项个数 } ``` - **解释**: - `printf("a=%f\n", a);`:将整型变量`a`以浮点数形式输出,这会导致错误的结果。 - `printf("z=%d\n", z);`:尝试将双精度浮点数`z`以整数形式输出,同样会产生不准确的结果。 - `printf("ch1=%c, ch1=%d\n", ch1 + 32, ch1 + 32);`:输出字符`a`以及整数值97。 - `printf("a=%d, b=%d\n", a, b);`:正确输出`a`和`b`的值。 - `printf("a=%d, b=%d\n", a);`:格式说明符个数多于输出项个数,导致运行时警告或错误。 - `printf("a=%d\n", a, b);`:格式说明符个数少于输出项个数,导致`b`的值被忽略。 3. **示例3** ```c void main() { int a, b; float x, y; char ch1, ch2; scanf("a=%d,b=%d", &a, &b); printf("scanf1:a=%d,b=%d\n", a, b); scanf("%d,%d", &a, &b); printf("scanf2:a=%d,b=%d\n", a, b); scanf("%d%d", &a, &b); printf("scanf3:a=%d,b=%d\n", a, b); // scanf函数中如果两个格式说明符之间没有字符且 // 格式说明符表示的数据类型为数值型值时,以空格或回车隔开两个操作数 scanf("%c", &ch1); printf("scanf4:ch1=%c\n", ch1); // 使用scanf和getchar读取字符时,注意观察其前面是否有过输入操作 // 如果有过输入操作,则在使用scanf和getchar前先读取出前一次输入操作 // 留在缓冲区中的回车符,否则结果可能出错 // 所以在scanf("%c",&ch1);前加一条语句getchar();即可得到正确结果 } ``` - **解释**: - `scanf("a=%d,b=%d", &a, &b);`:使用带有文本提示的格式字符串读取两个整数到`a`和`b`。 - `scanf("%d,%d", &a, &b);`:使用逗号作为分隔符读取两个整数。 - `scanf("%d%d", &a, &b);`:使用空格或回车作为默认分隔符读取两个整数。 - `scanf("%c", &ch1);`:读取一个字符到`ch1`。需要注意的是,在使用`scanf`读取字符时,如果前面有其他输入操作,可能会读取到前一个操作遗留的回车符,从而导致结果错误。 4. **示例4** ```c void main() { char ch1, ch2; scanf("%c%c", &ch1, &ch2); printf("scanf1:ch1=%c,ch2=%c\n", ch1, ch2); // 用scanf函数实现字符输入时,转义字符和空格均为有效输入 // scanf函数需要输入连续多个字符值时,字符值之间无需添加额外的分隔符如空格、回车 // 否则被均视为合法的输入字符,可能造成结果错误 } ``` - **解释**: - `scanf("%c%c", &ch1, &ch2);`:连续读取两个字符到`ch1`和`ch2`。需要注意的是,如果用户输入了多余字符或分隔符(如空格),那么这些字符也会被视为有效输入。 5. **示例5** ```c void main() { char ch1; int chInt; ch1 = getchar(); // 从键盘读取一个字符给变量ch1 putchar(ch1); // 将ch1的值以字符类型输出 getchar(); // 从缓存区中取出上次输入留下的回车符 chInt = getchar(); // 从键盘读取一个字符给变量ch1 putchar(chInt); // 将ch1的值以字符类型输出 } ``` - **解释**: - `ch1 = getchar();`:读取一个字符到`ch1`。 - `putchar(ch1);`:输出`ch1`。 - `getchar();`:读取前一次输入操作留下的回车符,避免影响下一次输入。 - `chInt = getchar();`:读取一个字符到`chInt`。这里需要注意,虽然`chInt`是整型,但是`getchar`仍然可以正确读取一个字符并将其存储到`chInt`中,只不过实际存储的是字符的ASCII码值。 6. **示例6** ```c void main() { int a = 2, b = 3, c; printf("%d,%d,%d\n", a, b, (a + b, a - b)); printf("%d,%d\n", a += b, a -= b); // 当printf的输出项为多个表达式时,从左向右计算每个表达式的值 } ``` - **解释**: - `printf("%d,%d,%d\n", a, b, (a + b, a - b));`:先计算`a + b`再计算`a - b`,最后输出`a`、`b`和`a - b`的值。 - `printf("%d,%d\n", a += b, a -= b);`:首先执行`a += b`使`a`等于5,然后执行`a -= b`使得`a`变为2,最后输出`5`和`2`。 通过以上示例的分析可以看出,正确使用`printf`函数和其他输入输出函数对于编写高效且无误的C语言程序至关重要。此外,理解格式字符串的工作原理以及如何处理不同类型的数据是非常关键的。希望这些示例能够帮助初学者更好地理解和掌握C语言的基础知识。
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助