从文件打印并存储在数组中。

时间:2018-04-23 13:17:39

标签: c arrays loops

我试图从一个文件读入一个数组,这在第一个for循环中显示。我的脚本的这部分工作,但是我希望用户给出的答案被复制到q结构中的数组q.a中。并在脚本的末尾打印出问题和答案。谁能解释为什么这对我不起作用?

  struct qa{/
  char q[40][250];
  char a40][250];
  };

int main()
{
   int a, i, k, l, j;

   FILE *fp;
   fp = fopen("quest.txt", "r");

   struct qa q;

      for(i>0;i<=11;i++){
      fgets(q.q, 250, (FILE*)fp);
      printf("%s", q.q);
      scanf("%s", q.a[l][j]);
      }

      for (i=0;i<11;i++){
        strncpy(q.a[j], q.q[k], 250);
      }

      for (i = 0; i < 11; i++){    
        printf("%s/n", q.a[l][j]);
      }

当我尝试运行仅在我将strncpy for循环放入时开始发生的脚本时,我收到了分段错误错误。

2 个答案:

答案 0 :(得分:2)

首先,你永远不会初始化你的值:i j k l永远不会被初始化,甚至不会被使用 然后你尝试用scanf("%s", q.a[l][j]);将char *放入char中 请参阅stacktrace StackTrace 出于调试目的,如果您使用IDE中的cli或任何调试器,请安装并使用valgrind / gdb,这样会更容易 这是我使用的代码,如果你想知道哪些行指向哪行代码 Code

scanf("%s", q.a[l][j]);更改为scanf("%s", q.a[l]);并对最后一个printf执行相同操作

还记得使用-W -Wall -Wextra这样的标志进行编译,以便您可以从编译器获得更多警告,它可以检测到您的大多数错误。Compilation

答案 1 :(得分:1)

这太可怕了:

  for(i>0;i<=11;i++){
  fgets(q.q, 250, (FILE*)fp);
  printf("%s", q.q);
  scanf("%s", q.a[l][j]);
  }

每行有一个不一致的地方!

for(i>0;i<=11;i++) for的第一个元素是赋值所以它永远不应该包含比较。你想要for(i=0; i<11; i++)

fgets(q.q, 250, (FILE*)fp); - q.q是一个char数组数组,当fgets期望的是字符数组时。它应该是fgets(q.q[i], 250, (FILE*)fp);

printf("%s", q.q);调用未定义的行为,因为q.q%s期望char指针时的字符数组数组。它应该是printf("%s", q.q[i]);

scanf("%s", q.a[l][j]); %s需要一个指向字符数组的指针,并为它指定一个字符的值!你想要的是scanf("%249s", q.a[i]);

这意味着什么:

  for (i=0;i<11;i++){
    strncpy(q.a[j], q.q[k], 250);
  }

jk是未初始化的自动变量,因此它们的值是任何。简而言之,您在随机存储位置编写随机值!

即便是最后一部分也很差:

  for (i = 0; i < 11; i++){    
    printf("%s/n", q.a[l][j]);
  }

l仍然未初始化,行尾是\n,带有反斜杠而不是直斜杠,而%s仍然需要一个字符指针...如果要打印问题和答案,只是做:

  for (i = 0; i < 11; i++){    
    printf("%s\n%s\n\n", q.q[i], q.a[i]);
  }

它会在一行上给你一个问题,在下一行上给出答案,在下一个集团之前给出空行。

TL / DR:你真的应该考虑学习C语言的基础知识......