C 带有2个ifs的代码不断给出第一个ifs';s结果

C 带有2个ifs的代码不断给出第一个ifs';s结果,c,C,我是C语言的新手,我的任务是制作一个计算次数的程序已在用户选择的文件中使用。所以我决定用一堆如果来做它,当我把第一个关闭(只有一个if)时它就工作了,但是当我添加else-if段时,它只是吐出了第一个if的结果(eof的数字),我不知道为什么会发生这种情况。代码如下: #include<stdio.h> #include<stdlib.h> int main() { FILE *fp; int s = 0; int ch; char in

我是C语言的新手,我的任务是制作一个计算次数的程序已在用户选择的文件中使用。所以我决定用一堆如果来做它,当我把第一个关闭(只有一个if)时它就工作了,但是当我添加else-if段时,它只是吐出了第一个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;
}
char in;
printf("Choose which file to be opened: inpt , eof or cntr\n");
scanf("%c", &in);

if (in = 'eof')
#包括
#包括
int main()
{
文件*fp;
int s=0;
int-ch;
炭素;
printf(“选择要打开的文件:inpt、eof或cntr\n”);
扫描频率(“%c”和“&in”);
如果(in='eof')
{
fp=fopen(“D:\\programming\\C projects\\kursova PIK 1\\kursova 1\\New folder\\eof.C”,“r”);
如果(fp==NULL)
{
printf(“打开文件时出错”);
}
其他的
{
而(!feof(fp))
{
ch=fgetc(fp);
如果(ch==';')
{
++s;
}
否则如果(ch==EOF)
打破
}
fclose(fp);
printf(“使用“;”的次数为:%d”,s);
}   
}
else if(in='inpt')
{
fp=fopen(“D:\\programming\\C projects\\kursova PIK 1\\kursova 1\\New folder\\inpt.C”,“r”);
如果(fp==NULL)
{
printf(“打开文件时出错”);
}
其他的
{
而(!feof(fp))
{
ch=fgetc(fp);
如果(ch==';')
{
++s;
}
否则如果(ch==EOF)
打破
}
fclose(fp);
printf(“使用“;”的次数为:%d”,s);
}
}
系统(“暂停”);
返回0;
}

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

char userinput[ 30];
然后使用

scanf( "%s", userinput);
并将其与字符串进行比较,而不是多字符文字:

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

if(in == 'eof)

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

在这大部分代码中存在多个问题:

#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;
}
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'
,因此该条件为true,因此始终执行代码的第一部分,而不管用户键入什么

看起来您确实需要字符串输入和字符串比较,这是通过
中的
strcmp()
完成的

这些是主要的初始问题;我不能保证没有其他人需要处理

而且,根据一般经验,最好在
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;
}

然后,您可以使用代码的单个副本来打开、读取、关闭和报告
filename
中指定的文件内容。尽可能避免重复。要么将它变成一个单独的函数,用不同的参数调用它,要么用我展示的相同方法消除重复。

检查下面的代码。您正在将多个字符与不正确的字符进行比较,因此为了比较字符串,请使用
strcmp()
,如下所示,并在代码的其他部分进行相同的更改

char in[5];

scanf("%s",&in);

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

in='eof'
fp==NULL
——看到区别了吗?这不是objective-c,请编辑您的问题,使其成为正确的标记,如果问题正确标记,则无需在标题中提及编程语言。此外,您似乎不知道多字符文字的含义@Juhana我已经尝试了
in==“eof”
,但仍然没有成功work@igrilkul当然不会–正如我上面解释的那样,您将字符与字符串混淆。请显示测试
scanf()
;否则,你就成功了。