函数保持崩溃而没有错误消息

时间:2014-11-10 12:23:18

标签: c function crash

您好我正在参加C编程课程的介绍,所以我使用非常基本的代码。在这里,我只是想从主字符串中获取逗号矩阵。但是,当我尝试运行该程序时,它一直在崩溃,我不知道我的问题是什么。我能够正确使用fgets功能,所以我觉得它还能正常工作。

CD Data.txt文件

Eagles, Hotel California, 1976, Rock, 4
The Fratellis, Costello Music, 2006, Garage Rock, 5
Awolnation, Megalithic Symphony, 2011, Indie Rock, 5
Lindsey Stirling, Lindsey Stirling, 2012, Classical Crossover, 5
Arctic Monkeys, AM, 2013, Indie Rock, 4

程序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define row 1000
#define column 1000

void getCommas(char str[], int commas[])
{
    int flag, count, index;

    count = 0;
    index = 0;
    flag = 1;
    while(flag = 1)
    {
        if(str[count] = ',')
        {
            commas[index] = count;
            index = index + 1;
        }
        count = count + 1;

        if(str[count] = '\0')
        {
            flag = 0;
        }
    }

}

int main()
{
    int i;

    char CdInfo[row][column];
    int Index[row][column];

    FILE *fp;
    fp = fopen("CD Data.txt","r");

    for(i=0; i<5; i++)
    {
        fgets(CdInfo[i], sizeof CdInfo, fp);
        //printf("%s\n",CdInfo[i]);
    }

    for (i=0; i<5; i++)
    {
        getCommas(CdInfo[i], Index[i]);
    }

    fclose(fp);
    return 0;
}

3 个答案:

答案 0 :(得分:3)

这两个变量太大而无法进入堆栈:

int main()
{
    int i;

    char CdInfo[row][column]; //<<
    int Index[row][column];   //<<

将它们声明为静态变量或全局变量。

while(flag = 1)

应该是

while(flag == 1)

和所有

if (str[count] = ...

应该是

if(str[count] == ...

答案 1 :(得分:0)

您还应考虑更换

while(flag = 1) {

with:

while(flag == 1)

答案 2 :(得分:0)

// note:
// the code is not making any use of more than one line of the
// input file at any one time, so
// only the current row actually needs to be defined

// note:
// this code makes no check for max length of each row (1000 char)
// that could/will be a problem when the input line is longer than 1000 character

// to avoid the error of writing an assignment rather than a literal,
// place the literal on the left side, 
// then the compiler will notify you of the error
// rather than you having to spend time debugging the code
// trying to find the error

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define row 1000
#define column 1000

//void getCommas(char str[], int commas[])
void getCommas( char * pStr, int * pCommas )
{
    //int flag, count, index;

    //count = 0;
    //index = 0;
    //flag = 1;
    int flag = 1;
    int count = 0;
    int index = 0;

    //while(flag = 1)
    // following while loop could eliminate 
    // the 'flag' variable and related code by using
    // and would be safer because never looking at string termination
    // character but once.
    // while( '\0' != pStr[count] )
    while( 1 == flag )
    {
        //if(str[count] = ',')
        if( ',' == pStr[count] )
        {
            pCommas[index] = count;
            index = index + 1;
        }
        count = count + 1;

        //if(str[count] = '\0')
        if( '\0' == pStr[count] )
        { // then found end of string
            flag = 0;
        }
    }
}

char CdInfo[row][column];
int Index[row][column];

int main()
{
    int i = 0;
    int rowCount = 0;

    //char CdInfo[row][column]; // this is a huge item on the stack, 
    //int Index[row][column]; // this is a huge item on the stack, 

    //FILE *fp;
    FILE *fp = NULL;
    fp = fopen("CD Data.txt","r");

    // always check the result of calls to io functions
    if ( NULL == fp )
    { // then fopen failed
        perror( "fopen" );
        exit(1);
    }

    // implied else

    // there is no reasonable reason (in the real world) 
    // to expect the input to be only 5 lines
    //for(i=0; i<5; i++)
    //{
    //    fgets(CdInfo[i], sizeof CdInfo, fp);
    //    //printf("%s\n",CdInfo[i]);
    //}
    for( i=0; i<row; i++ )
    {
        // following line checks results of call to I/O function 
        if( 0 == fgets( CdInfo[i], row, fp ) ) { break; }
        // above line exits loop on end of file or I/O error
        rowCount++;
    }

    //for (i=0; i<5; i++)
    for( i = 0; i < rowCount; i++ )
    {
        getCommas(CdInfo[i], Index[i]);
    }


    fclose(fp);
    return 0;
}