printf()和scanf()详细用法

目录

一、printf

        1、基本用法

        2、占位符用法及基本占位符类型

        3、输出格式

二、scanf

         1、基本用法

         2、占位符用法及基本占位符类型

         3、赋值忽略符


一、printf(需要包含头文件stdio.h)

        1、基本用法

                        

#include<stdio.h>
int main()
{
    printf("hello world")
    return 0;
}

          直接打印出hello world,如果需要换行,要加\n。例如

#include<stdio.h>
int main()
{
    printf("hello world\n")
    printf("apple");
    return 0;
}

        2、占位符用法及基本占位符类型

printf("you have %d pen and %d apple",3,5);

        其中  %d作为该语句的占位符可以在后面用符合该占位符的值替换 ,如果不符合,则会报错 ,而占位符也可以一句连用多个。常用占位符如下

 %a :十六进制浮点数,字母输出为小写。
 %A :十六进制浮点数,字母输出为大写。
 %c :字符。
 %d :十进制整数。
 %e :使用科学计数法的浮点数,指数部分的 e 为小写。
 %E :使用科学计数法的浮点数,指数部分的 E 为大写。
 %i :整数,基本等同于 %d 。
 %f :小数(包含 float 类型和 double 类型)。
 %g :6个有效数字的浮点数。整数部分一旦超过6位,就会自动转为科学计数法,指数部分的 e为小写。
 %G :等同于 %g ,唯一的区别是指数部分的 E 为大写。
 %hd :十进制 short int 类型。​
 %ho :八进制 short int 类型。​
 %hx :十六进制 short int 类型。​
 %hu :unsigned short int 类型。​
 %ld :十进制 long int 类型。
 %lo :八进制 long int 类型。
 %lx :十六进制 long int 类型。
 %lu :unsigned long int 类型。​
 %lld :十进制 long long int 类型。​
 %llo :八进制 long long int 类型。​
 %llx :十六进制 long long int 类型。​
 %llu :unsigned long long int 类型。​
 %Le :科学计数法表示的 long double 类型浮点数。​
 %Lf :long double 类型浮点数。​
 %n :已输出的字符串数量。该占位符本身不输出,只将值存储在指定变量之中。

 %o :八进制整数。
 %p :指针。
 %s :字符串。
 %u :无符号整数(unsigned int)。​
 %x :十六进制整数。
 %zd : size_t 类型。(其中size_t输入无符号整形)
 %% :输出一个百分号。

        3、输出格式

	printf("%9.4f", 12.224);

        输出结果为

	printf("%-9.4f", 12.224);

       

        那为何会这样呢?,原因是%9.4f中,9是最小宽度,4是最小小数占位,不足补0;而最小宽度中+9是像右对齐最小占9个格,而-9则是向左对齐,最小占9个格;

二、scanf(需要包含头文件stdio.h)

         1、基本用法

#include<stdio.h>
int main()
{
    scanf("%d",&a);
}

       和printf有点类似,都是需要占位符和参数,其中参数中要携带地址,而&符号就是取地址的意思  ,同时也可以一次读多个变量,例如

scanf("%d%d%f%f",&a,&b,&c,&d);

       这个表示a和b需要输入十进制整数,而c和d需要输入浮点数。输入完之后可以利用printf打印出来,而输入的值则类似于赋值

        2、占位符中断用法及基本占位符类型

scanf("%d%d%f%f",&a,&b,&c,&d);

         如果不想要赋值给后面,那么可以在输入过程中进行强制中断,而强制中断的方法是按ctrl+z;但在vs环境中需要连续按三次ctrl+z;基本占位符类型如下:

 %c :字符。
 %d :整数。
 %f : float 类型浮点数。
 %lf : double 类型浮点数。
 %Lf : long double 类型浮点数。
 %s :字符串。
 %[] :在方括号中指定一组匹配的字符(比如 %[0-9] ),遇到不在集合之中的字符,匹配将会
停止

        而值得注意的是,除了%c,其他都会自动忽略棋手的空白字符;而占位符%s,规则是,从当前第一个非空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止。和一般的字符串不太一样。

        3、赋值忽略符

        有的时候,用户输入可能不符合预定格式。例如:

scanf("%d-%d-%d",&year,&month,&day);

        我们需要输入year-month-day,如果输入格式错误,例如3/2/3;则scanf()解析数据就会失败。

        为了避免这种情况,需要把赋值忽略符*放在任何占位符的百分号后面,该占位符就不会返回值,解析后会被丢弃,例如:

scanf("%d*%c%d*%c%d",&year,&month,&day);

        而中间输入任何字符都不会影响后面结果;

最后,说一下,scanf和printf这俩个差不多是我们最常用的,我们把这块弄会了可以省掉许多麻烦

       

<think>我们被要求解释C语言printfscanf函数的基本用法示例。根据引用内容,我们可以总结如下: printf函数: - 用于输出格式化数据到标准输出(通常是屏幕)。 - 需要包含头文件<stdio.h>。 - 基本语法:printf("格式字符串", 参数列表); - 格式字符串中可以包含格式说明符(如%d、%f、%s等),它们会被后面参数的值替换。 scanf函数: - 用于从标准输入(通常是键盘)读取格式化数据。 - 同样需要包含头文件<stdio.h>。 - 基本语法:scanf("格式字符串", 参数地址列表); - 注意:scanf的参数必须是变量的地址,因此在变量前需要加上取地址运算符&(除了字符串数组名本身代表地址的情况)。 下面我们详细说明并给出示例。 ### printf函数详解 **格式说明符:** - `%d`:输出有符号十进制整数 - `%f`:输出浮点数(默认保留6位小数) - `%c`:输出单个字符 - `%s`:输出字符串 - `%%`:输出一个百分号 **示例1:基本输出** ```c #include <stdio.h> int main() { printf("Hello, world!\n"); // 输出字符串并换行 return 0; } ``` **示例2:带格式说明符的输出** ```c #include <stdio.h> int main() { int age = 25; float height = 1.75; char grade = 'A'; char name[] = "Alice"; printf("Name: %s\n", name); // 输出字符串 printf("Age: %d\n", age); // 输出整数 printf("Height: %.2f meters\n", height); // 输出浮点数,保留两位小数 printf("Grade: %c\n", grade); // 输出字符 return 0; } ``` 输出: ``` Name: Alice Age: 25 Height: 1.75 meters Grade: A ``` ### scanf函数详解 **格式说明符(同printf类似):** - `%d`:读取整数 - `%f`:读取浮点数 - `%c`:读取单个字符 - `%s`:读取字符串(遇到空白字符停止) **示例3:基本输入** ```c #include <stdio.h> int main() { int num; printf("Enter an integer: "); scanf("%d", &num); // 注意取地址符& printf("You entered: %d\n", num); return 0; } ``` **示例4:多个输入** ```c #include <stdio.h> int main() { int age; float height; char name[20]; printf("Enter your name, age and height (separated by space): "); // 注意:字符串数组name前面不加&,因为数组名就是地址 scanf("%s %d %f", name, &age, &height); printf("Name: %s\nAge: %d\nHeight: %.2f\n", name, age, height); return 0; } ``` 运行示例: ``` Enter your name, age and height (separated by space): Tom 20 1.80 Name: Tom Age: 20 Height: 1.80 ``` ### 注意事项 1. **scanf的安全问题**:当读取字符串时,如果输入的长度超过数组大小,会导致缓冲区溢出。为避免这种情况,可以使用`%ns`(n为最大字符数)来限制读取长度,例如`%19s`表示最多读取19个字符(为字符串结束符`\0`留一个位置)。 2. **读取含空格的字符串**:`%s`遇到空格会停止,如果需要读取一行(包括空格),可以使用`fgets`函数。 3. **格式匹配**:在scanf的格式字符串中,非格式说明符的普通字符必须与输入严格匹配。例如`scanf("a=%d", &x);`要求输入形式为`a=10`。 ### 相关问题 1. 如何用printf输出不同进制的整数(如八进制、十六进制)? 2. scanf函数在读取数值时遇到非数字字符会如何处理? 3. 如何避免scanf读取字符串时的缓冲区溢出问题? 4. 使用printfscanf进行文件输入输出需要什么函数? [^1]: 引用内容提供了scanf函数需要取地址符的说明 [^2]: 引用内容提供了printf函数的基本用法示例 [^3]: 引用内容提供了%s格式说明符的使用示例</think>### C语言printf scanf 函数详解 #### 一、printf 函数(格式化输出) **基本语法**: ```c printf("格式字符串", 参数列表); ``` **核心功能**: - 向标准输出(通常是屏幕)打印格式化数据 - 使用**格式说明符**指定数据类型格式 - 需要包含头文件 `#include <stdio.h>` **常用格式说明符**: | 说明符 | 用途 | 示例 | |--------|-----------------------|-------------------| | `%d` | 整数 | `printf("%d", 42);` | | `%f` | 浮点数 | `printf("%.2f", 3.1415);` | | `%c` | 单个字符 | `printf("%c", 'A');` | | `%s` | 字符串 | `printf("%s", "Hello");` | | `%p` | 指针地址 | `printf("%p", &x);` | | `%%` | 输出百分号 | `printf("100%%");` | **使用示例**: ```c #include <stdio.h> int main() { int age = 25; float height = 1.75; char grade = 'A'; printf("基本信息:\n"); // 直接输出字符串 printf("年龄: %d 岁\n", age); // 整数输出 printf("身高: %.2f 米\n", height); // 浮点数保留两位小数 printf("等级: %c\n", grade); // 字符输出 printf("完成度: 100%%\n"); // 输出百分号 return 0; } ``` 输出结果: ``` 基本信息: 年龄: 25 岁 身高: 1.75 米 等级: A 完成度: 100% ``` #### 二、scanf 函数(格式化输入) **基本语法**: ```c scanf("格式字符串", &变量1, &变量2, ...); ``` **核心特性**: - 从标准输入(通常是键盘)读取格式化数据 - **必须使用取地址符 `&`**(字符串数组除外) - 格式说明符与 printf 类似 **使用示例**: ```c #include <stdio.h> int main() { int age; float height; char name[50]; printf("请输入姓名: "); scanf("%s", name); // 字符串数组不需要& printf("请输入年龄身高: "); scanf("%d %f", &age, &height); // 多个输入用空格分隔 printf("\n用户信息:\n"); printf("姓名: %s\n", name); printf("年龄: %d\n", age); printf("身高: %.2f米\n", height); return 0; } ``` 运行示例: ``` 请输入姓名: Alice 请输入年龄身高: 25 1.68 用户信息: 姓名: Alice 年龄: 25 身高: 1.68米 ``` #### 三、关键注意事项 1. **scanf 必须使用 `&` 取地址符**(字符串数组除外)[^1] ```c int x; scanf("%d", &x); // 正确 scanf("%d", x); // 错误!会导致未定义行为 ``` 2. **字符串输入的特殊性** - 使用 `%s` 读取字符串到字符数组 - 数组名本身是地址,不需要 `&` ```c char name[20]; scanf("%s", name); // 正确 ``` 3. **格式匹配问题** ```c // 输入必须严格匹配格式 int day, month, year; scanf("%d/%d/%d", &day, &month, &year); // 要求输入格式: 25/07/2023 ``` 4. **缓冲区问题** - 混合输入字符数值时需清空缓冲区 ```c int age; char ch; scanf("%d", &age); while((ch = getchar()) != '\n'); // 清空输入缓冲区 scanf("%c", &ch); ``` #### 四、高级技巧 1. **宽度限定符**: ```c int num = 123; printf("%8d", num); // 输出: " 123"(占8字符宽度) ``` 2. **动态格式控制**: ```c int precision = 3; float pi = 3.1415926; printf("%.*f", precision, pi); // 输出: 3.142 ``` 3. **安全输入**(防止缓冲区溢出): ```c char name[20]; scanf("%19s", name); // 限制最多读取19个字符 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值