基本上我要做的是从文本文件中读取微分方程,然后用撇号('是第一顺序)对它们进行分类(''是二阶)然后将每个方程存储到一个我可以的数组中然后打印,如果他们是第一或第二个订单。它说我没有错误但是当我运行它时,我的编译器崩溃了。我做错了什么?
#include <stdio.h>
main()
{
FILE *fin;
int i;
char line[300];
int value = 0;
fin = fopen("DIFFERNTIAL_EQNS.txt", "r");
while(fgets(line, sizeof line, fin) != EOF)
{
for (i = 0; i < 300; i++)
if (line[i] == ('\''))
{
if (line[i++] == ('\''))
{
value = 2;
}
value = 1;
}
}
if (value == 1)
printf("this is 1st order\n");
else
printf("this is 2nd order\n");
fclose(fin);
}
答案 0 :(得分:1)
您的代码有几个问题:
我认为这一行是一个问题:
while(fgets(line, sizeof line, fin) != EOF)
fgets
不会返回EOF
。完成后(或出错时)返回NULL
。
所以试试:
while(fgets(line, sizeof line, fin) != NULL)
或只是
while(fgets(line, sizeof line, fin))
此外,这条线很糟糕:
for (i = 0; i < 300; i++)
您无法确定fgets
填满了整个阵列。而是做:
for (i = 0; line[i]; i++) // or for (i = 0; line[i] != '\0'; i++)
这样你才能继续直到零终止。
你有错误:
if (line[i] == ('\''))
{
if (line[i++] == ('\'')) <---- use +1 instead
{
value = 2;
}
value = 1; // <------ You always overwrite with 1 so you never get 2
}
取而代之的是:
if (line[i] == ('\''))
{
value = 1;
if (line[i+1] == ('\''))
{
value = 2;
}
}
此外,您的代码似乎只能处理一行,因为您只是在每个循环中覆盖value
。也许你想把打印放在循环中。像:
while(fgets(line, sizeof line, fin))
{
for (i = 0; line[i]; i++)
if (line[i] == ('\''))
{
value = 1;
if (line[i+1] == ('\''))
{
value = 2;
}
}
// Print the result for this line before reading next line
if (value == 1)
printf("this is 1st order\n");
else if (value == 2)
printf("this is 2nd order\n");
else
printf("Didn't find anything\n");
value = 0;
}
fclose(fin);
然后是另一个问题 - 考虑输入:
X&#39;&#39; + 3x&#39; + x
上面的代码会说它是第一顺序,因为3x'
将&#34;覆盖&#34;值为1.所以你需要确保不要从2回到1。也许像:
if (line[i] == ('\''))
{
if (value == 0) value = 1; // Changed this
if (line[i+1] == ('\''))
{
value = 2;
}
}
答案 1 :(得分:0)
它崩溃是因为fopen几乎无疑是找不到文件。 (如果您运行调试器,则启动或主目录可能不是您认为的那个)。然而,这也是一个错误。通常,如果使用for循环,则不应在循环体内增加计数器。另外,你应该在行[i] == 0上断行,否则你会在字符串结束后读取随机垃圾。
答案 2 :(得分:0)
fgets()
不像其他输入函数那样返回字符,而是返回成功时指向字符串的指针,或NULL
。 NULL
与EOF
非常不同!因此,与EOF
的比较总是产生错误,因此无法留下while()
循环(我想,你的程序只是冻结了。)
要解决此问题,只需将fgets()
的结果与NULL
进行比较,或者只是写一下
while(fgets(line, sizeof line, fin)) {
因为NULL
始终被解释为假值。
顺便说一句:我看到你的程序中还有三个错误:
由于未检查终止零字节而超出fgets()
返回的行字符串。这很容易导致字符串的错误分类。
您不允许任意长线。如果我是你,我会使用getline()
而不是fgets()
:它会自动分配一个缓冲区以适应该行,从而可以正确处理任意长度的输入。
i++
在之后使用增加值。因此,您的两个if(line[...] == ('\''))
语句要么同时触发,要么不触发,因为它们会检查相同的字符。