C语言TXT读取display函数调用失效,嵌入主函数可正常运行
导致display函数无法正常触发执行的代码错误
- 程序执行时序完全颠倒,选择变量未初始化即参与分支判断
代码在main函数内定义int choose后,既没有给变量赋初始值,也没有等待用户输入,就直接执行switch(choose)分支判断。此时choose存储的是栈内存上的随机垃圾值,几乎不可能命中case 1的分支逻辑,封装的display函数自然永远不会被调用。更违背基本逻辑的是,用于读取用户输入的scanf(...)语句,是放在整个switch判断块执行完毕后才运行的,完全搞反了“先获取用户输入、再根据输入做分支判断”的执行顺序。 - 用户输入读取的代码存在严重类型和参数错误
代码中使用scanf("%s", choose)读取用户选择,首先格式符和变量类型完全不匹配:%s是用于读取字符串的格式符,需要传入字符缓冲区的首地址,但这里choose是int类型的整型变量,直接传值会触发非法内存访问;其次就算是要读取整型的1/2选择,正确写法应该使用%d格式符,并且传入choose的内存地址即&choose,当前写法既无法将用户输入的内容正确写入choose变量,还可能直接引发程序崩溃。 - 函数声明位置不符合C语言语法规范
代码在main函数的执行流中间(switch判断前、switch块结束后、函数返回前)反复插入int display();的函数声明。在C89标准中,函数块内的所有变量、函数声明必须放在所有可执行语句的最开头,把声明穿插在printf、switch、scanf等执行语句中间,在多数编译器下会直接触发语法编译错误,导致程序根本无法生成可执行文件。 - display函数内部存在多处逻辑漏洞,即便被触发也无法正常完成功能
- 使用无边界检查的
gets(fname)读取文件名,极易引发缓冲区溢出,且该函数早已被C语言标准彻底移除,不具备可移植性。 - 文件读取的格式串
fscanf(fp, "%[^\0]", str)逻辑错误:%[^\0]的读取终止条件是遇到ASCII为0的空字符,但普通TXT文本文件不存在内嵌的空字符,该写法不仅无法正常读到文件结尾,还可能越界访问str数组的内存边界。 - 文件操作没有做空指针保护:如果
fopen打开文件失败返回NULL,后续代码会直接执行fclose(fp),对空指针执行关闭操作会直接触发程序崩溃。
内容的提问来源于stack exchange,提问作者Haseeb Ur Rehman
相关产品推荐
相关产品推荐

