【发布时间】:2021-04-21 23:23:20
【问题描述】:
我想遍历一个文本文件并连接所有字符串,直到遇到一个空行,然后对下一个字符串执行相同的操作,依此类推。每个字符串连接的结果应该添加到一个 char* 数组中:
char* element_arr[287];
void splitPassports(FILE* file_to_read){
char element[500];
char str[80];
int i = 0;
int j = 0;
while(j < FILELENGTH){
if (fgets(str,80, file_to_read) && !isBlank(str)){
strcat(element,str);
printf("The string is: %s\n",str);
}else if (isBlank(str)){
element_arr[i] = element;
memset(element, '\0', sizeof element);
printf("%s\n",element_arr[0]);
i++;
}
j++;
}
fclose(file_to_read);
}
但是,当我尝试执行此操作时,出现非法硬件指令错误(我在 Mac 上)。如何正确地将新字符串添加到现有字符串中,然后将其附加到我的数组中,然后将其设置回零以对几行执行相同操作,直到遇到空行? 我对 C 比较陌生,所以在此先感谢 :)
【问题讨论】:
-
element是一个字符宽(终止符)。任何非空连接都将调用未定义的行为。无关,while(!feof(file_to_read))is wrong. -
请花一些时间刷新How to Ask,以及this question checklist。请不要在您显示的代码中包含行号。
-
另请注意,代码将导致更多未定义的行为,而不仅仅是数组越界问题。您还返回一个指向本地数组
element的指针,该数组的生命周期以函数结束。 -
你从哪里得到错误?在
return?可能是因为您在element_arr中写入了超过 287 个条目,或者在str中写入了超过 80 个字符。 -
@Phil 好的,您已更改代码。那么是的,它是
element_arr。 但是因为element_arr中的所有初始化元素都被初始化为指向element,那么你仍然有同样的问题。您也从未初始化element_arr的未使用元素,因此无法知道已初始化元素的数量。我建议您使用指针、动态分配、重新分配和strdup函数动态创建element_arr数组及其元素。
标签: c string macos clang strcat