C语言文件I/O编程报segmentation fault (core dumped)错误如何解决
问题修复说明
核心报错原因
你调用fopen("output.txt", "w")后没有将返回的文件指针赋值给全局变量patternOut,导致patternOut始终为空指针,后续图案生成函数中调用fprintf向空指针写入内容,直接触发段错误。
其余需要修复的逻辑问题
getUserValue函数存在两处错误:- 局部变量
returnedValue未初始化就进行大小判断,属于未定义行为 - 输入校验的循环条件逻辑错误:原条件
returnedValue <= 2 && returnedValue >= 9永远不可能成立,无法起到限制输入范围的作用
- 局部变量
- 使用
%c读取菜单选项时会误读之前输入残留的换行符,导致菜单选择逻辑出错 - 文件使用完毕后未调用
fclose关闭,可能导致输出内容没有真正写入磁盘 - 未做文件打开失败的判断,若权限不足等原因导致
fopen返回空,后续写入仍然会触发异常
修正后完整代码
#include <stdbool.h> #include <stdio.h> #include <stdlib.h> #define PATTERN1 '1' #define PATTERN2 '2' #define PATTERN3 '3' #define PATTERN4 '4' #define QUIT '5' #define SIZE_MIN 2 #define SIZE_MAX 9 void printInstructions(); void printMenu (); char getMenuChoice (); int getUserValue (); void displayPattern1 (int value); void displayPattern2 (int value); void displayPattern3 (int value); void displayPattern4 (int value); void printGoodbye (); FILE *patternOut; int main () { // 将fopen返回值赋值给全局文件指针 patternOut = fopen("output.txt", "w"); // 增加文件打开失败判断 if (patternOut == NULL) { printf("文件打开失败,请检查权限\n"); return 1; } printInstructions(); printMenu(); switch (getMenuChoice()) { case PATTERN1: displayPattern1(getUserValue()); break; case PATTERN2: displayPattern2(getUserValue()); break; case PATTERN3: displayPattern3(getUserValue()); break; case PATTERN4: displayPattern4(getUserValue()); break; case QUIT: printf("Ending the program\n"); break; } // 关闭文件,确保内容写入磁盘 fclose(patternOut); printGoodbye(); return 0; } void printInstructions() { printf("This program will make a shape for you.\n"); } void printMenu() { printf("\n1: 正对角线三角形\n"); printf("2: 反对角线三角形\n"); printf("3: 右上填充三角形\n"); printf("4: 左下填充三角形\n"); printf("5: 退出程序\n"); } char getMenuChoice() { char returnedValue; printf("\n请选择菜单选项:"); // %c前加空格跳过空白字符,避免读入残留换行 scanf(" %c", &returnedValue); return returnedValue; } int getUserValue() { int returnedValue; printf("请输入图案大小(2-9之间):"); // 修正循环逻辑,输入不在范围内就重新输入 while (1) { scanf("%d", &returnedValue); if (returnedValue >= SIZE_MIN && returnedValue <= SIZE_MAX) { break; } printf("输入不合法,请重新输入2-9之间的整数:"); } return returnedValue; } void displayPattern1(int size) { int row, column; for (row = 1; row <= size; row++) { for (column = 1; column <= size; column++) { if(row == column) { fprintf(patternOut, "%d", size); }else { fprintf(patternOut, "*"); } } fprintf(patternOut, "\n"); } } void displayPattern2(int size) { int row, column; for (row = 1; row <= size; row++) { for (column = 1; column <= size; column++) { if(size - column +1 == row) { fprintf(patternOut, "%d", size); }else { fprintf(patternOut, "*"); } } fprintf(patternOut, "\n"); } } void displayPattern3(int size) { int row, column; for (row = 1; row <= size; row++) { for (column = 1; column <= size; column++) { if(column > size - row + 1) { fprintf(patternOut, "%d", size); }else { fprintf(patternOut, "*"); } } fprintf(patternOut, "\n"); } } void displayPattern4(int size) { int row, column; for (row = 1; row <= size; row++) { for (column = 1; column <= size; column++) { if(row > column) { fprintf(patternOut, "%d", size); }else { fprintf(patternOut, "*"); } } fprintf(patternOut, "\n"); } } void printGoodbye() { printf("\n感谢使用本图案生成程序!祝您使用愉快!"); }
内容的提问来源于stack exchange,提问作者codeChimp
相关产品推荐
相关产品推荐

