Tab or 空格?这是一个问题,其实也不是问题

使用空格缩进提高代码可读性和压缩效率
本文详细阐述了在编程中使用空格而非Tab进行缩进的优势,包括代码美观、压缩率高及跨平台一致性,并强调了在不同编辑器环境下设置的重要性。

首先

首先,在纠结Tab还是空格之前,一定要明确一点:Tab和空格不能混用!Tab和空格不能混用!Tab和空格不能混用!重要的事情说三遍。

然后

推荐使用空格,除非必须使用Tab的情况。空格缩进一般是4个,也有2个或者其他的。使用空格缩进的理由如下:
1. 使用空格缩进在任何情况下查看代码时都是代码对齐的,然而,如果使用Tab缩进,除非你的Tab的缩进设置是与作者一样,否则代码不会对齐,不好看!
2. Tab是制表符,而不是缩进符!
3. 使用空格的代码具有更大的代码压缩率,如果你需要将代码压缩发布的话。

最后

使用空格缩进并不会造成不便,因为在实际的实践中,都是将IDE或者编辑器的Tab设置成4个空格的缩进,所以使用Tab键,但实际上还是4个空格的缩进。如果你的编辑器或者IDE并不支持这种设置,第一,可能是你并没有找到怎么设置,第二,如果真的不支持,那么,你可以考虑换一个IDE了。嗯,就这样。

你指出的问题非常关键且准确! 我们来**重新审视这个问题的核心要求**: > 修改练习1的函数,在读取 n 个字符后停止,**或在读到第1个空白、制表符或换行符时停止**,哪个先发生就停止。 你说:“我输入空格它没有停止”——说明程序没有按预期工作。 --- 我们先**定位原代码问题所在**。 ### ❌ 原代码中 `getchar()` 被 `scanf()` 影响了! ```c printf("最多读取多少个字符? "); scanf("%d", &n); getchar(); // 清除输入缓冲区中的换行符 ← 这里有问题! ``` 这个 `getchar();` 的本意是清除用户输入数字后的换行符(`\n`),但它 **只能清除一个字符**。如果用户输入的是: ``` 5[回车] abc def ``` 那么 `getchar()` 只清除了 `[回车]`,后面的 `"abc def"` 是正常输入。 但是!!! 如果用户输入的是: ``` 5 abc def[回车] ``` 也就是说,在输入 `5` 之后**直接打了空格再继续输入内容**,像这样: ``` 5 abc def ``` 此时 `scanf("%d", &n)` 只读走了 `5`,**空格后面的 `abc def` 仍然留在输入缓冲区中**! 接着 `get_n_or_stop()` 中的 `getchar()` 会立刻读到那个空格 → 应该立刻 `break` → 停止读取 → 结果字符串为空。 但我们观察不到“停止”,是因为:**你的测试方式可能是分开两行输入的,避开了缓冲区残留问题**。 --- ## ✅ 真正正确的做法:**完全清空输入缓冲区直到换行符** 否则 `scanf` 留下的空格会影响后续 `getchar()`! --- # ✅ 正确版本(修复输入缓冲问题) ```c #include <stdio.h> // 函数:读最多n个字符,遇到空格Tab、换行则提前停止 void get_n_or_stop(char *str, int n) { int i = 0; int ch; printf("请输入最多 %d 个字符(遇到空格Tab或换行则停止):\n", n); while (i < n) { ch = getchar(); // 如果是空格、制表符、换行符,立即停止 if (ch == ' ' || ch == '\t' || ch == '\n') { break; } str[i] = (char)ch; i++; } str[i] = '\0'; // 添加字符串结束符 } // 辅助函数:清除输入缓冲区中剩余字符 void flush_input() { int ch; while ((ch = getchar()) != '\n' && ch != EOF); } int main() { char buffer[100]; int n; printf("最多读取多少个字符? "); // 安全读取整数并清空整行 if (scanf("%d", &n) != 1) { printf("输入无效!\n"); return 1; } flush_input(); // 确保把数字后面的所有字符(包括空格)都清掉 // 调用函数 get_n_or_stop(buffer, n); printf("实际读取并保存的字符为:\"%s\"\n", buffer); return 0; } ``` --- ## ✅ 测试场景验证 ### 场景1:正常输入(每行独立) ``` 最多读取多少个字符? 5 请输入最多 5 个字符(遇到空格Tab或换行则停止): hello world ``` → 程序读取 `'h','e','l','l','o'` → 第6个字符是空格 → `break` → 输出 `"hello"` ✅ 正确! --- ### 场景2:输入带空格的数字行 ``` 最多读取多少个字符? 5 abcdef ``` 原来的问题就在这里! 旧代码中 `scanf("%d", &n)` 只读了 `5`,剩下的 `" abcdef"` 还在缓冲区里。 然后 `getchar()` 读到第一个字符就是空格 → 立刻 `break` → 字符串为空 → 输出 `""` 这是符合逻辑的,但看起来像是“没反应”。 所以我们用了 `flush_input()` 函数把这些残余全部清除,避免干扰主输入。 --- ## 🔍 为什么你会觉得“输入空格没停止”? 很可能是因为: - 你在主输入行里敲的是: ``` abcdef ``` 没有空格 → 当然不会停 - 或者你在数字那一行加了空格,但没意识到它被当作“后续输入”了 - 或者你期望输入 `"a b"` 时程序在 `b` 前停下,但实际上程序已经在 `a` 后遇到空格才停 --- ## ✅ 正确测试方法 试试这个输入流程: ``` 最多读取多少个字符? 10 请输入最多 10 个字符(遇到空格Tab或换行则停止): xyz test ``` 你应该看到输出: ``` 实际读取并保存的字符为:"xyz" ``` ✅ 成功在空格处停止! 再试: ``` ab Tcdef ← T 是 Tab 键 ``` 输出应为 `"ab"` ✅ 成功识别 Tab 并停止! --- # ✅ 总结:修复要点 | 问题 | 解决方案 | |------|----------| | `scanf` 留下未读字符影响 `getchar` | 使用 `flush_input()` 清空整行 | | 多种空白字符需统一判断 | 用 `ch == ' ' || ch == '\t' || ch == '\n'` | | 必须及时终止循环 | 一旦满足条件立即 `break` | --- # 知识点(列出该代码中遇到的知识点) - **输入缓冲区管理**:`scanf` 不会读完整行,需手动清空残余字符以防干扰后续输入。 - **`getchar()` 精确控制输入**:能逐个读取字符并检测空格Tab、换行等特殊字符。 - **字符串提前终止逻辑**:使用 `break` 实现“任一条件满足即停止”,体现优先级控制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值