【问题标题】:illegal hardware instruction error when concatenating two strings in c在c中连接两个字符串时出现非法硬件指令错误
【发布时间】: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


【解决方案1】:
  1. char element[] = ""; 你声明了 1 个字符长的数组,所以 strcat 总是会失败(除非第二个字符串也是空的)。

  2. 即使你以正确的方式定义它,赋值element_arr[i] = element;你每次都会为数组元素分配相同的引用,因此数组将简单地填充对同一对象的引用。

  3. while(!feof(file_to_read)) - 阅读Why is “while ( !feof (file) )” always wrong?

我建议从 C 书开始,因为您不了解该语言的基础知识。

【讨论】:

  • 但是必须有办法做到这一点?还有两个问题: 1. 当我尝试将元素设为 char* 时,是否会解决您提到的问题 1? 2. 为什么总是对元素的引用相同,我不能只是“清除”字符串并为其分配一些新值?然后将哪个添加到 element_arr?
  • @Phil 提出的问题表明指针和数组对您来说是“黑色巫术魔法”。正如我所写 - 从书中学习 C。做练习。没有其他办法。所以不是替代品
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-06
  • 2018-08-25
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 2012-06-03
相关资源
最近更新 更多