EOF 上的段错误,而 c 中的循环



我们已经将问题缩小到这个函数。 这个旨在接收一组要搜索的单词,例如: 鱼 John 思念 不紧跟在要搜索的 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] = '';
            row++;
            col = 0;
        }
        else
        {
            items[row][col] = c;
            col++;
        }
    }
    numWords = row + 1;
    return numWords;
}

谢谢!

不能 100% 确定,因为您尚未发布函数调用,但您的items数组可能太小。当您尝试设置items[row][col]时,您将越界。

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

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

2) 声明chintgetchar()返回 256 种不同的charEOF。 要区分这 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] = '';
  end = 0;
  }   

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

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

5)建议更改numWords计数。

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

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

int acceptItems(char items[][COLS])

您还可以同时提供这两个维度,但您不必:

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

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

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

顺便说一句,函数getchar返回一个int(以允许文件结束指示)。所以你基本上应该使用int c而不是char c(我认为否则你永远不会有c == EOF)。

相关内容

  • 没有找到相关文章

最新更新