具有2个ifs的代码不断给出第一个结果

时间:2015-01-17 17:53:23

标签: c

我是C的新手,我的任务是制作一个计算次数的程序';'已在用户选择的文件中使用。所以我决定用一堆ifs来制作它,当我把第一个if(只有一个if)时它起作用但是当我添加else if if segment它只是吐出第一个if的结果(eof的数字)而我是找出了为什么会发生这种情况的线索。这是代码:

#include<stdio.h>
#include<stdlib.h>

int main()
{
    FILE *fp;
    int s = 0;
    int ch;
    char in;
    printf("Choose which file to be opened: inpt , eof or cntr\n");
    scanf("%c", &in);

    if (in = 'eof')
    {
        fp = fopen("D:\\programming\\C projects\\kursova PIK 1\\kursova 1\\New folder\\eof.c", "r");
        if (fp == NULL)
        {
            printf("Error opening file");
        }
        else
        {
            while (!feof(fp))
            {
                ch = fgetc(fp);
                if (ch == ';')
                {
                    ++s;
                }
                else if (ch == EOF)
                    break;
            }
            fclose(fp);
            printf("The number of times ';' was used is: %d", s);
        }   
    }
    else if (in = 'inpt')
    {
        fp = fopen("D:\\programming\\C projects\\kursova PIK 1\\kursova 1\\New folder\\inpt.c", "r");
        if (fp == NULL)
        {
            printf("Error opening file");
        }
        else
        {
            while (!feof(fp))
            {
                ch = fgetc(fp);
                if (ch == ';')
                {
                    ++s;
                }
                else if (ch == EOF)
                    break;
            }
            fclose(fp);
            printf("The number of times ';' was used is: %d", s);
        }
    }
    system("pause");

    return 0;
}

3 个答案:

答案 0 :(得分:1)

您不能将3个字母的字符串输入到单个char变量中。如果您计划用户输入eof或类似内容,则需要声明数组字符,例如

char userinput[ 30];

然后用

输入用户选择
scanf( "%s", userinput);

并将其与字符串进行比较,而不是多字符文字:

if( strcmp( userinput, "eof") == 0)
    process a file

而不是

if(in == 'eof)

最后,请注意您使用加倍等号==来比较值。单个=是一个赋值,而不是C中的比较。

答案 1 :(得分:0)

这些代码中存在多个问题:

char in;
printf("Choose which file to be opened: inpt , eof or cntr\n");
scanf("%c", &in);

if (in = 'eof')

您已将代码设置为读取单个字符,这本身并不是主要问题。您应该使用" %c"作为跳过前导空格的格式,但这是一个改进。

您应该检查scanf()是否成功:

if (scanf(" %c", &in) != 1)
    return 1;

然后尝试将单个字符输入与多个字符进行比较。并且,正如评论中指出的那样,这是不成功的,因为您不是比较,而是指定(===之间的差异)。多字符字符文字是不可移植的。但是,保证的一件事是多字符文字不为零,因此您的if条件是以下的简写:

if ((in = 'eof') != 0)

由于多字符常量不是'\0',因此条件为真,因此无论用户输入什么内容,都会始终执行代码的第一部分。

看起来你真的需要字符串输入和字符串比较,这是通过strcmp()的{​​{1}}完成的。

<string.h>

这些是最初的主要问题;我不能保证没有其他人可以处理。

而且,作为一般经验法则,最好使用换行符结束char in[10]; printf("Choose which file to be opened: inpt, eof or cntr\n"); if (scanf("%9s", in) != 1) return 1; if (strcmp(in, "eof") == 0) 语句。你有:

printf()

您应该使用:

printf("The number of times ';' was used is: %d", s);

您好像printf("The number of times ';' was used is: %d\n", s); if块中的大部分代码都相同。这表明你应该使用一个函数,或使用:

else if

然后,您可以拥有一份代码副本,以打开,阅读,关闭和报告char *filename = 0; if (strcmp(in, "eof") == 0) filename = "D:\\programming\\C projects\\kursova PIK 1\\kursova 1\\New folder\\eof.c"; else if (strcmp(in, "inpt") == 0) filename = "D:\\programming\\C projects\\kursova PIK 1\\kursova 1\\New folder\\inpt.c"; else { fprintf(stderr, "Did not understand '%s'\n", in); return 1; } 中指定的文件内容。尽可能避免重复。要么将它变成一个单独的函数,用不同的参数调用,要么以我显示的相同的一般方式消除重复。

答案 2 :(得分:0)

检查以下代码。您正在将多个字符与不正确的字符进行比较,以便比较使用strcmp()的字符串,如下所示,如果部分代码也在其他地方进行相同的更改。

char in[5];

scanf("%s",&in);

if(strcmp(in,"eof") == 0)
{
}
else if(strcmp(in,"inpt") == 0)
{
}