对C标准中空白字符(空格、回车符(\r)、换行符(\n)、水平制表符(\t)、垂直制表符(\v)、换页符(\f))的理解

本文介绍了C标准库中的isspace()函数,详细讲解了空格、回车符、换行符、水平制表符、垂直制表符和换页符在C语言中的作用和ASCII值。通过示例展示了这些字符在终端和文本文件中的不同表现,特别是在不同操作系统下的差异。

       C标准库里<ctype.h>中声明了一个函数:

              int isspace(int c);

       该函数判断字符c是否为一个空白字符。

       C标准中空白字符有:空格(‘ ’)、换页(‘\f’)、换行(‘\n’)、回车(‘\r’)、水平制表符(‘\t’)、垂直制表符(‘\v’)六个。下面是本人的一些理解。

 

空格

       相信大家对它非常了解。值得注意的是它的ASCII码为0x20,而不是0x00。0x00代表空(NULL)。本人初学C时认为空格值为0,惭愧惭愧。

 

回车(‘\r’)

       我们在编辑文件时,一般敲一下回车键就会转到下一行编辑。那么“回车”和“换行”是不是一回事呢?

     &n

在使用 `scanf` 读取输入时,特别是在混合使用 `scanf` 和 `getchar()`、`fgets()` 等函数时,经常会遇到“吃掉换行符”的问题。这是因为 `scanf` 在读取数据后会将输入缓冲区中的换行符 `\n` 留下,而后续的输入函数可能会误把这个换行符当作用户输入。 例如: ```c #include <stdio.h> int main() { int age; char name[50]; printf("请输入年龄: "); scanf("%d", &age); printf("请输入姓名: "); fgets(name, sizeof(name), stdin); // 这里会直接读到换行符,导致跳过输入! printf("年龄: %d, 姓名: %s\n", age, name); return 0; } ``` 输出可能为: ``` 请输入年龄: 25 请输入姓名: 年龄: 25, 姓名: ``` 原因:`scanf("%d", &age);` 读取了 `25`,但回车键产生的 `\n` 仍留在输入缓冲区中,`fgets` 直接读取这个 `\n` 就结束了。 --- ### ✅ 解决方案:吃掉 `scanf` 后的换行符 #### 方法一:用 `getchar()` 手动吸收换行符 ```c #include <stdio.h> int main() { int age; char name[50]; printf("请输入年龄: "); scanf("%d", &age); getchar(); // 吃掉换行符 printf("请输入姓名: "); fgets(name, sizeof(name), stdin); printf("年龄: %d, 姓名: %s", age, name); return 0; } ``` > 注意:`getchar()` 只能吸收一个字符,确保前一个输入确实只留下一个 `\n`。 --- #### 方法二:在 `scanf` 格式字符串中跳过空白字符(推荐) C语言中,格式说明之间的**空白字符**(空格、换行、制表符)会匹配任意数量的空白字符。 你可以这样写: ```c #include <stdio.h> int main() { int age; char name[50]; printf("请输入年龄: "); scanf("%d", &age); printf("请输入姓名: "); scanf(" %[^\n]", name); // 注意前面的空格!它会跳过所有前置空白(包括\n) printf("年龄: %d, 姓名: %s\n", age, name); return 0; } ``` 解释: - `" %[^\n]"` 中: - 空格表示跳过所有空白字符(如 `\n`, `\t`, 空格等) - `%[^\n]` 表示读取除换行符外的所有字符 - 这样就能安全读取字符串,不会被残留的换行影响 --- #### 方法三:统一使用 `fgets` + `sscanf`(最安全推荐) 避免混合使用 `scanf` 和 `fgets`,推荐全部用 `fgets` 读一行,再解析: ```c #include <stdio.h> #include <string.h> int main() { char buffer[100]; int age; char name[50]; printf("请输入年龄: "); fgets(buffer, sizeof(buffer), stdin); sscanf(buffer, "%d", &age); printf("请输入姓名: "); fgets(name, sizeof(name), stdin); // 去掉末尾换行符(可选) name[strcspn(name, "\n")] = '\0'; printf("年龄: %d, 姓名: %s\n", age, name); return 0; } ``` 优点: - 安全,不会遗留换行符 - 避免输入缓冲区污染 - 更适合复杂输入场景 --- ### 总结 | 方法 | 说明 | 推荐程度 | |------|------|---------| | `getchar()` | 简单直接,吸收一个换行 | ⭐⭐⭐ | | `scanf(" %[^\n]")` | 利用格式跳过空白 | ⭐⭐⭐⭐ | | `fgets + sscanf` | 最安全,推荐用于正式项目 | ⭐⭐⭐⭐⭐ | ---
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值