1. 字符串输入输出函数详解
在C语言中,字符串的输入输出是基础但极其重要的操作。新手程序员经常会在这里踩坑,下面我将详细解析puts和gets这两个常用函数。
1.1 puts函数深度解析
puts函数是C标准库中最简单的字符串输出函数之一,它的原型定义在stdio.h头文件中:
c复制int puts(const char *str);
这个函数的工作原理其实比你想象的更有意思:
- 它会从str指针指向的内存地址开始,逐个字符输出,直到遇到'\0'结束符
- 输出完成后,puts会自动追加一个换行符'\n'
- 返回值是输出的字符数(包括自动添加的换行符),如果出错则返回EOF
注意:puts遇到'\0'就会停止输出,所以如果你的字符串中间有'\0',后面的内容不会被输出
实际使用中,puts比printf("%s\n", str)效率更高,因为puts是专门为字符串输出优化的。下面是一个典型的使用示例:
c复制#include <stdio.h>
int main() {
char greeting[] = "Hello, World!";
puts(greeting); // 输出后会换行
return 0;
}
1.2 gets函数的安全隐患与替代方案
gets函数用于从标准输入读取一行字符串,它的原型是:
c复制char *gets(char *str);
这个函数有几个重要特性:
- 它会读取输入直到遇到换行符或EOF
- 读取的内容会存入str指向的缓冲区,并自动在末尾添加'\0'
- 换行符'\n'会被丢弃,不会存入缓冲区
但是,gets有一个致命的安全问题——它不会检查缓冲区大小。比如:
c复制char buffer[10];
gets(buffer); // 如果输入超过9个字符就会导致缓冲区溢出
在实际开发中,绝对不要使用gets!C11标准已经将其移除。替代方案有:
-
使用fgets:
c复制fgets(buffer, sizeof(buffer), stdin);fgets会保留换行符,且会检查缓冲区大小
-
使用scanf的限制宽度:
c复制scanf("%9s", buffer); // 最多读取9个字符
重要提示:gets可以接收包含空格的字符串,而scanf的%s格式会在空格处停止读取。这是gets唯一比scanf强的地方,但安全性问题使它完全不应该被使用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 流程控制基础
程序流程控制是编程的核心概念,决定了代码的执行顺序和逻辑分支。
2.1 顺序结构
顺序结构是最简单的执行方式,代码从上到下依次执行。例如:
c复制#incl
