You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言文件I/O编程报segmentation fault (core dumped)错误如何解决

问题修复说明

核心报错原因

你调用fopen("output.txt", "w")后没有将返回的文件指针赋值给全局变量patternOut,导致patternOut始终为空指针,后续图案生成函数中调用fprintf向空指针写入内容,直接触发段错误。

其余需要修复的逻辑问题

  • getUserValue函数存在两处错误:
    1. 局部变量returnedValue未初始化就进行大小判断,属于未定义行为
    2. 输入校验的循环条件逻辑错误:原条件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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 18:36:07