c - 段错误(核心转储),无编译错误

标签 c

这是一个用用户输入的参数初始化扫雷器然后打印的程序。当我运行它时(输入参数后),我遇到段错误(核心转储)。但它编译时没有错误或警告。我如何找到错误? 我尝试在 Ubuntu 终端和 Windows 10 中的 dev-C++ 中编译并运行它。没有区别。有任何想法吗? 预先感谢您。

//File: 5.2mineboard_setup.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROWS 101            //Μέγιστο επιτρεπόμενο ύψος πίστας
#define COLUMNS 101         //Μέγιστο επιτρεπομενο μήκος πίστας

void welcome(void);
int getRows(void);
int getColumns(void);
int getBombs(int, int);
void initializeBoard(char board[ROWS][COLUMNS], int, int);
void putBombs(char board[ROWS][COLUMNS], int, int, int);
void putNums(char board[ROWS][COLUMNS], int, int);
void putBorder(char board[ROWS][COLUMNS], int, int);
void printBoard(char board[ROWS][COLUMNS], int, int);

int main(void)
{
//  system ("chcp 1253");                   //Uncomment to run in Windows. Comment to run on Unix
    int Rows, Columns, Bombs;
    char Board[ROWS][COLUMNS];
    welcome();                              //Μήνυμα υποδοχής
    Rows = getRows();                       //Πλήθος γραμμών
    Columns = getColumns();                 //Πλήθους στηλών
    Bombs = getBombs(Rows, Columns);        //Εισαγωγή πλήθους βομβών
    initializeBoard(Board, Rows, Columns);  //Αρχικοποίηση του πίνακα με χαρακτήρες κενού
    putBombs(Board, Rows, Columns, Bombs);  //Τυχαία τοποθέτηση βομβών (όχι στις ακραίες στήλες και σειρές)
    putNums(Board, Rows, Columns);          //Καταμέτρηση βομβών σε γειτονικά τετράγωνα
    putBorder(Board, Rows, Columns);        //Τοποθέτηση περιγράμματος πίστας
    printBoard(Board, Rows, Columns);       //Εκτύπωση πίστας
    return 0;
}

//Τίτλος προγράμματος
void welcome(void)
{
    printf("Δημιουργία πίστας ναρκαλιευτή\n");
    printf("=============================\n\n");
}   

//Εισαγωγή ύψους πίστας
int getRows(void)
{   
    int rows;
    printf("Εισάγετε ύψος πίστας από 1 ως %d: \n", (ROWS-2));
    scanf ("%d",&rows);
    while(rows>(ROWS-2))    //Έλεγχος αν το ύψος υπερβαίνει το μέγιστο επιτρεπόμενο
    {
        printf("Υπερβολικά μεγάλο ύψος. Εισάγετε νέο ύψος: \n");
        scanf("%d",&rows);          
    }
    return rows;
}   

//Εισαγωγή μήκους πίστας
int getColumns(void)
{
    int columns;
    printf("Εισάγετε μήκος πίστας από 1 ως %d: \n", (COLUMNS-2));
    scanf ("%d",&columns);
    while(columns>(COLUMNS-2))  //Έλεγχος αν το μήκος υπερβαίνει το μέγιστο επιτρεπόμενο
    {
        printf("Υπερβολικά μεγάλο μήκος. Εισάγετε νέο μήκος: \n");
        scanf("%d",&columns);           
    }
    return columns;
}   

//Εισαγωγή αριθμού βομβών
int getBombs(int r, int c)
{   
    int bombs;
    printf("Εισάγετε πλήθος βομβών από 1 ως %d: \n", (r*c));
    scanf ("%d",&bombs);
    while(bombs>(r*c))  //Έλεγχος αν χωράνε οι βόμβες
    {
        printf("Όπα, δε χωράνε τόσες βόμβες. Εισάγετε νέο πλήθος βομβών: \n");
        scanf("%d",&bombs);         
    }
    return bombs;
}

//Αρχικοποίησε πίνακα με χαρακτήρες κενού
void initializeBoard(char board[ROWS][COLUMNS], int rows, int columns)
{
    int i, j;
    for(i=0; i<(ROWS); i++)
        for(j=0; j<(COLUMNS); j++)
            board[i][j] = ' ';
}

/*Τοποθέτησε x βόμβες σε τυχαίες θέσεις
(όχι στο περίγραμμα), προσεχοντας να μη συμπέσουν*/
void putBombs(char board[ROWS][COLUMNS], int rows, int columns, int bombs)
{
    int i, j, k;
    srand(time(NULL));
    for(k=0; k<bombs; k++)              //Επανάλαβε τόσες φορές όσες οι βόμβες
    {
        do
        {
            i = 1 + rand()/rows;        //Τυχαία επιλογή γραμμής
            j = 1 + rand()/columns;     //Τυχαία επιλογή στήλης
        }
        while(board[i][j] != ' ');      //Αν είναι βόμβα, κάνε νέα τυχαία επιλογή
        board[i][j] = '*';              //Βάλε βόμβα
    }
}   

/*Τοποθέτησε αριθμούς με το πλήθος των γειτονικών βομβών
στα κελιά που δεν έχουν βόμβες (όχι στο περίγραμμα)*/
void putNums(char board[ROWS][COLUMNS], int rows, int columns)
{
    int i, j, k, l;
    char n;                                     //Πλήθος γειτονικών βομβών σε μορφή char
    int m = 0;                                  //Αρχικοποίηση μετρητή βομβών
    for(i=1; i<(rows-1); i++)                   //Για κάθε εσωτερικό κελί
        {
        for(j=1; j<(columns-1); j++)
            if(board[i][j] != '*')              //Αν δεν είναι βόμβα
                for(k=(i-1); k<i+2; k++)        //Έλεγξε τα γειτονικά κελιά
                    for(l=(j-1); l<j+2; l++)    
                        if(board[k][l] = '*')   //Για καθένα που είναι βόμβα
                            m++;                //Αύξησε τον μετρητή βομβών κατά 1
        char n = (char)m;                       //casting από int σε char για το πλήθος γειτονικών βομβών
        board[i][j] = 'm';                      //Δώσε στο κελί την τιμή του μετρητή βομβών
        }
}

//Καταχώρισε περίγραμμα πίστας
void putBorder(char board[ROWS][COLUMNS], int rows, int columns)
{
    int i, j;
    if(i==0 || i==rows+1)
        board[i][j] = '-';
    if(j==0 || j==columns+1)
        board[i][j] = '|';
}

//Τύπωσε τελική πίστα
void printBoard(char board[ROWS][COLUMNS], int rows, int columns)
{
    int i,j;
    for(i=0; i<rows+1; i++)
    {
        printf("\n");
        for(j=0; j<columns+1; j++)
        {
            printf("%c", board[i][j]);
        }
    }
    printf("\n");
}

最佳答案

没有编译器警告?为什么不呢?

函数putBorder使用未初始化的变量ij

void putBorder(char board[ROWS][COLUMNS], int rows, int columns)
{
    int i, j;
    if(i==0 || i==rows+1)
        board[i][j] = '-';
    if(j==0 || j==columns+1)
        board[i][j] = '|';
}

该函数似乎缺少一些循环,如函数 printBoard 中所示。

void putBorder(char board[ROWS][COLUMNS], int rows, int columns)
{
    int i, j;
    for(i=0; i<rows+1; i++)
    {
        for(j=0; j<columns+1; j++)
        {
            if(i==0 || i==rows+1)
                board[i][j] = '-';
            if(j==0 || j==columns+1)
                board[i][j] = '|';
        }
    }
}

但是,复制这些循环后,它们的上限似乎减少了 1。所以我建议

i<rows+2
j<columns+2

等等,在这两个函数中,允许四周都有边框。

关于c - 段错误(核心转储),无编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53991462/

相关文章:

c - UBUNTU on VMWARE Segmentation fault (core dumped)

c - #include 目录是否在 C 项目中有效?

使用C将字符串常量转换为数值

c - fatal error : openssl/opensslconf. h:没有这样的文件或目录

c - 如何确定嵌入式系统 C 上正在使用的内存?

c - 如何生成数字列表的所有排列?

c - Microsoft Visual Studio 2017 需要非常基本的帮助 : "The system cannot find the file specified"

c - 处理 IRP_MJ_SHUTDOWN

c - ARM编译器中的__promise是如何提高效率的

c++ - 在 Linux 上与静态 C 运行时链接的共享库和可执行文件。他们每个人都像Windows一样有单独的堆吗?