我试图从一个文件读入一个数组,这在第一个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循环放入时开始发生的脚本时,我收到了分段错误错误。
答案 0 :(得分:2)
首先,你永远不会初始化你的值:i j k l永远不会被初始化,甚至不会被使用
然后你尝试用scanf("%s", q.a[l][j]);
将char *放入char中
请参阅stacktrace
出于调试目的,如果您使用IDE中的cli或任何调试器,请安装并使用valgrind / gdb,这样会更容易
这是我使用的代码,如果你想知道哪些行指向哪行代码
将scanf("%s", q.a[l][j]);
更改为scanf("%s", q.a[l]);
并对最后一个printf执行相同操作
还记得使用-W -Wall -Wextra这样的标志进行编译,以便您可以从编译器获得更多警告,它可以检测到您的大多数错误。
答案 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);
}
j
和k
是未初始化的自动变量,因此它们的值是任何。简而言之,您在随机存储位置编写随机值!
即便是最后一部分也很差:
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语言的基础知识......