关于scanf在读取数据时何时跳过空格,何时读取空格的思考总结

scanf函数使用空白(换行符,制表符,空格)把输入分为多个字段,在依次把转换说明和字段匹配时跳过字符,首先你要知道什么是转换说明(%d,%f等),但唯一例外的是%c,根据%c,scanf会读取每一个字符,包括空白。
换句话说,除了%c模式,scanf在读取输入时会跳过非空白字符前的所有字符,然后一直读取字符,直到遇到空白字符或与正在读取的字符不匹配的字符,(转换说明符与其所对应的参数数据类型不一样)。具体可参考书籍《C Primer Plus 中文版》(第六版)。P92 P98.
下面看几个例子:

例子一:

#include<stdio.h>
int main()
{
   
   
    char M,N;

    scanf("%c %c",&M,&N);//%c之前加空格与不加空格之间的区别
    printf("%c%c",M,N)return 0;
}
a						b	//输入a				b,则正确读入a与b,scanf中两个%c之间的空格起到了在scanf读取时帮助其跳过空格的作用,关于在输入时%c前面加空格的作用我的另一篇文章已介绍过,若scanf中的两个%c之间没有空格则输出a加上一个空格
ab
Process returne
`scanf` 函数使用 `%s` 格式符来读取字符串,但它会在遇到空格、制表符或换行符停止读取。因此,如果需要读取包含空格的字符串,使用 `%s` 是不合适的。为了读取包含空格的字符串,你可以使用以下方法: 1. 使用 `fgets` 函数:`fgets` 函数可以读取一行文本,包括空格,直到达到指定的字符数(数组大小减一,以便为字符串结束符 `\0` 留出空间)或者遇到换行符。`fgets` 函数的原型如下: ```c char *fgets(char *str, int n, FILE *stream); ``` 其中 `str` 是目标字符串数组的指针,`n` 是最大读取字符数,`stream` 是输入流(例如 `stdin`)。 2. 如果仍然想使用 `scanf`,可以通过指定一个合适的宽度限制来读取固定长度的字符串,但这样会丢失换行符之后的文本,如下所示: ```c char str[100]; scanf("%99s", str); // 假设字符串长度不会超过99 ``` 这样做可以避免读取到换行符之前的空格,但不能读取超过指定长度的字符串。 3. 使用循环和 `scanf` 读取单个字符:可以通过循环使用 `%c` 格式符来读取字符串,直到遇到换行符或达到预期长度,但这种方法需要手动处理空格,并且要小心避免缓冲区溢出。 ```c char str[100]; int i = 0; char c; while ((c = getchar()) != '\n' && i < sizeof(str) - 1) { str[i++] = c; } str[i] = '\0'; // 确保字符串以空字符结尾 ``` 需要注意的是,`scanf` 在读取遇到空格会停止,但它不会将空格加入到字符串中,而是留在输入缓冲区中,可能会影响后续的输入操作。因此,使用 `fgets` 或者手动循环读取通常更加灵活和安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值