我们已将问题范围缩小到此功能。这个意思是接受一组要搜索的单词,如: 鱼 约翰 小姐 不 在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;
}
谢谢!
答案 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
声明为int
。 getchar()
会返回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
。