在C语言中,命令行输入主要通过两种方式实现:命令行参数(程序启动时传递)和运行时交互输入(程序运行中从键盘读取),以下是详细说明:
命令行参数(argc
和 argv
)
当通过终端启动程序时,可直接在命令后附加参数:
./myprogram arg1 arg2
在C代码中通过 main
函数的参数获取:
int main(int argc, char *argv[]) { printf("参数数量: %d\n", argc); // argc 表示参数个数(含程序名) for (int i = 0; i < argc; i++) { printf("参数 %d: %s\n", i, argv[i]); // argv 存储参数字符串数组 } return 0; }
输出示例:
参数数量: 3
参数 0: ./myprogram
参数 1: arg1
参数 2: arg2
运行时交互输入
程序运行过程中,通过标准输入函数读取用户输入:
scanf()
读取格式化输入
int main() { int age; char name[50]; printf("输入年龄: "); scanf("%d", &age); // 读取整数 printf("输入姓名: "); scanf("%49s", name); // 限制长度防止溢出 printf("姓名: %s, 年龄: %d\n", name, age); return 0; }
fgets()
安全读取字符串(推荐)
int main() { char input[100]; printf("输入文本: "); fgets(input, sizeof(input), stdin); // 读取一行(含换行符) printf("你输入了: %s", input); return 0; }
关键注意事项
-
缓冲区溢出防护
- 避免使用不安全的
gets()
(已弃用),改用fgets()
并指定最大长度。 - 示例:
fgets(buffer, 100, stdin)
最多读取99字符(留1位给\0
)。
- 避免使用不安全的
-
输入验证
- 检查
scanf()
返回值,确保成功匹配:if (scanf("%d", &num) != 1) { printf("输入错误!"); while (getchar() != '\n'); // 清空输入缓冲区 }
- 检查
-
混合输入问题
- 当
scanf()
后接fgets()
时,残留的换行符会被fgets()
读取,需清理缓冲区:int c; while ((c = getchar()) != '\n' && c != EOF); // 跳过剩余字符
- 当
- 命令行参数:通过
argc/argv
在程序启动时传递数据,适合配置项。 - 交互输入:使用
scanf()
或fgets()
读取用户输入,后者更安全。 - 安全第一:始终验证输入长度和格式,避免漏洞。
引用说明:本文内容参考C11标准(ISO/IEC 9899:2011)及 GNU C 库文档,遵循安全编程最佳实践。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/5617.html