我是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;
}
答案 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)
{
}