我们已经将问题缩小到这个函数。 这个旨在接收一组要搜索的单词,例如: 鱼 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) 声明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] = ' ';
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
)。