C语言:I/O 详细区分
2026/7/12 3:31:34 网站建设 项目流程

一、总表(末尾换行 \n 规则)


https://download.csdn.net/download/2601_95085114/9310717

逐个详细拆解

🔹 输入函数(从键盘读数据到内存)

1. gets(char *str)(禁用)

流程

1. 不断读取字符,直到按下回车;

2. 回车\n直接扔掉,不放进数组;

3. 在有效文字的最后,自动添加 \0。
例子:输入 abc+回车
内存:a b c \0

2. fgets(str, size, stdin)(标准安全函数)

流程

1. 最多读取 size-1 个字符;遇到回车就停止;

2. 回车符 \n 会保存在数组里;

3. 在全部字符的末尾,系统自动补上 \0。
例子:输入 abc+回车
内存:a b c \n \0

3. s_gets()(自己封装的改良版fgets)

标准写法:读到\n之后,将换行符覆盖为\0。
if (fgets(str,81,stdin))
{
str[strcspn(str,"\n")] = '\0';
}
输入abc+回车 → 内存:a b c \0

4.scanf("%s", str)

1. 跳过开头所有空格、回车;

2. 之后持续读字符,再次碰到空格/回车就结束;

3. 空白字符全部丢弃,数组里绝对不会有\n;

4. 末尾自动加\0。
缺陷:无法输入带空格的内容。

5.getchar()

一次只读取一个字符,回车 \n 也是普通字符。
常用于场景:scanf读完数字后,吃掉缓冲区剩下的换行。
scanf("%d",&a);
getchar(); // 把回车吸收掉,防止fgets读到空行
🔹 输出函数(把内存字符打印到屏幕)

1.puts(str)

• 从首字符开始打印,碰到\0结束;

• 强制规则:打印完字符串,自动额外输出一个换行 \n。
puts("hi");
// 屏幕输出:hi + 自动换行
2.fputs(str, stdout)

• 原样输出字符串,读到\0停止;

• 不会自动追加任何换行符。
想要换行必须手动写:
fputs("hi",stdout);
putchar('\n');
3. printf()

严格照搬你写的内容:

• printf("abc");:只输出abc,不换行;

• printf("abc\n");:输出abc然后换行。

4. putchar(ch)

仅仅输出单个字符。
putchar('\n') 等价于换行操作。
高频易错口诀

1.输入

• gets:吃掉回车,补\0;

• fgets:收留回车,末尾补\0;

• scanf:遇见空格就停下,完全不带换行。

2.输出

• puts:自带换行;

• fputs:不带换行;

• printf/putchar:你不加\n,就永远不换行。

四、经典坑点

用scanf("%d")读取数字之后,缓冲区还残留回车\n,下一次直接用fgets,会直接读到这个换行,造成空输入。
解决方法:读取数字后加一句 getchar(); 清空换行。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询