c中循环时的EOF段错误

时间:2014-02-24 22:42:14

标签: c while-loop segmentation-fault eof

我们已将问题范围缩小到此功能。这个意思是接受一组要搜索的单词,如:     鱼     约翰     小姐     不 在NxN网格搜索后立即出现,并延伸到文件末尾。 我试图使用指针将这些单词放入类似2D数组的结构中,并且她给了我一个分段错误。 救命? 这是代码:

    int acceptItems(char** items)/*Function reads in 2D array of items to be searched for*/
{
    int row = 0;/*row, col keep track of position*/
    int col = 0;
    int numWords;/*Number of words to be searched for*/
    int end = 1;/*1 means continue, 0 means end*/
    char c;/*Temporary char for input*/

    while(end == 1)
    {
        c = getchar();

        if(c == EOF)/*Case ends repetition at end of file*/
        {
            end = 0;
        }   
        else if(c == '\n')
        {
            items[row][col] = '\0';
            row++;
            col = 0;
        }
        else
        {
            items[row][col] = c;
            col++;
        }
    }

    numWords = row + 1;

    return numWords;
}

谢谢!

3 个答案:

答案 0 :(得分:1)

由于您尚未发布函数调用,因此无法100%确定,但您的items数组可能太小。当您尝试设置items[row][col]时,您将超出范围。

答案 1 :(得分:1)

1)在main()中,确保items被声明为指针,而不是int

// char items;  (from comment)
char** items;   (** may or may not be missing from your comment. @Red Alert)

2)将ch声明为intgetchar()会返回256个不同的char EOF。要区分这257个不同的结果,请不要使用char,而应使用int

// char c;
int c;
...
c = getchar();

3)检测到EOF后,终止当前字符串。 (我认为就是这样。通过不终止此行,使用numWords = row + 1和您的上一行而不是\n结尾,在打印最后一行时永远不会设置终结符没有\ 0导致UB可怕的地方。)

if(c == EOF)/*Case ends repetition at end of file*/
  {
  items[row][col] = '\0';
  end = 0;
  }   

4)添加测试以确保您没有写出界限。这是第二个想法,某个地方的代码大胆地去了以前没有代码的地方。

if (row >= 100 || col >= 100) HandleError();
items[row][col] = ...

5)建议更改numWords次。

 numWords = row;
 if (col > 0) numWords++;

答案 2 :(得分:0)

如果在函数acceptItems之外声明一个2D数组,然后在调用此函数时将其作为参数传递,则需要提供(在函数声明中)至少“较低”维度:

int acceptItems(char items[][COLS])

您也可以提供这两个尺寸,但不必:

int acceptItems(char items[ROWS][COLS])

任何类型数组的一般规则是,您必须提供除“最高”之外的所有维度:

int func(int arr[][S2][S3][S4][S5])

BTW,函数getchar返回int(为了允许文件结尾指示)。所以你基本上应该使用int c而不是char c(我认为你不会有c == EOF