C编程:将字符串存储并从文本文件中分类到数组中

时间:2016-10-01 07:04:30

标签: c

基本上我要做的是从文本文件中读取微分方程,然后用撇号('是第一顺序)对它们进行分类(''是二阶)然后将每个方程存储到一个我可以的数组中然后打印,如果他们是第一或第二个订单。它说我没有错误但是当我运行它时,我的编译器崩溃了。我做错了什么?

#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);
}

3 个答案:

答案 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 NULLEOF非常不同!因此,与EOF的比较总是产生错误,因此无法留下while()循环(我想,你的程序只是冻结了。)

要解决此问题,只需将fgets()的结果与NULL进行比较,或者只是写一下

while(fgets(line, sizeof line, fin)) {

因为NULL始终被解释为假值。

顺便说一句:我看到你的程序中还有三个错误:

  • 由于未检查终止零字节而超出fgets()返回的行字符串。这很容易导致字符串的错误分类。

  • 您不允许任意长线。如果我是你,我会使用getline()而不是fgets():它会自动分配一个缓冲区以适应该行,从而可以正确处理任意长度的输入。

  • i++在之后使用增加值。因此,您的两个if(line[...] == ('\''))语句要么同时触发,要么不触发,因为它们会检查相同的字符。