首先,这是一项家庭作业,关键字已经过期,很遗憾按原样提交。现在我正在为自己的学习过程发帖,因为我仍然无法理解我做错了什么。我已经尝试过搜索这个特定的问题,但似乎没有什么比这个更合适了,有些问题已经接近但是问题与不同的答案是分开的,这些答案与我遇到的确切问题并不特别相关。
我所拥有的是由'#'分隔的.txt文件。赋值是将输入读入动态数组,以允许添加和删除要在MadLib句子中使用的单词。
article
the
a
one
some
any
#
noun
boy
girl
dog
#
verb
drove
jumped
walked
skipped
#
preposition
to
from
over
under
on
#
我所做的是打开文件,阅读内容,确定每个部分有多少项,然后我有我认为正确的是根据nItems的结果为动态数组分配内存。然后我将文件倒回()并开始逐行将内容复制到名为temp的单独变量中。然后这就是它有点泥泞的地方,虽然我以为我正确地做了这个,也许我的calloc不太正确,我不确定,但我认为这些项目然后通过for和if复制到相应的数组中声明。所有这些看起来都很好(没有错误)但是当我尝试打印出阵列时,我得到了一个分段错误。
我不确定我搞砸了什么部分。如果可能的话,我想要更多的信息以便更好地理解所有这些,这样我就可以学习和改进,并希望不会犯同样的错误。一般来说指针似乎给我带来了最大的麻烦,我得到了他们的目的,但是当涉及到实现时,它对我来说是一个打击或错过。
这是我的一个函数中的一些代码。
void fillArray(char * article, char * noun, char * verb, char * prep, FILE * fin)
{
int row = 0;
row = getRows(fin, row);
article = (char*)calloc(row, sizeof(char*));
row = getRows(fin, row);
noun = (char*)calloc(row, sizeof(char*));
row = getRows(fin, row);
verb = (char*)calloc(row, sizeof(char*));
row = getRows(fin, row);
prep = (char*)calloc(row, sizeof(char*));
rewind(fin);
arrFill(article, fin);
arrFill(noun, fin);
arrFill(verb, fin);
arrFill(prep, fin);
}
void arrFill(char * arr, FILE * fin)
{
int i, size;
size = sizeof(arr);
char temp[100];
fgets(temp, 100, fin);
for(i = 0; i < size; i ++)
{
fgets(temp, 100, fin);
stripChar(temp);
if(*temp != '#')
strcpy(&arr[i], temp);
}
}
我感谢任何帮助和建设性意见。
答案 0 :(得分:1)
您的代码存在一些问题。首先,当您为article
分配内存时,您为row
个字符分配内存,而不是row
个字符串。然后,您不会重置行计数器,因此您将为noun
分配文章数和的名词数(仍然是一些单个字符而不是字符串)。
以上导致其他问题,例如当您执行
时strcpy(&article[i], temp);
您尝试将字符串复制到字符(即不是指针)。这将导致未定义的行为。
另一个问题是例如sizeof(article)
返回指针的大小,而不是指向的大小。
第四个问题是您按值传递指针,即当您调用函数时,复制参数时传递的指针,并且在分配内存时仅覆盖副本。您需要通过引用传递指针(即作为指针的指针)。