题目描述

牛牛想尝试一些新的料理,每个料理需要一些不同的材料,问完成所有的料理需要准备多少种不同的材料。

输入描述:
每个输入包含 1 个测试用例。每个测试用例的第 i 行,表示完成第 i 件料理需要哪些材料,各个材料用空格隔开,输入只包含大写英文字母和空格,输入文件不超过 50 行,每一行不超过 50 个字符。

输出描述:
输出一行一个数字表示完成所有料理需要多少种不同的材料。

示例1

输入
复制
BUTTER FLOUR
HONEY FLOUR EGG

输出
复制
4

include<stdio.h>

include<string.h>

char material[1250][51]={0}; --------------------------------------- //二维数组,用来存放原材,每个一维数组存放原材的名称,原材的名称最长50个字符加上1个\0共计51。每种料理最多25种原材,最多50种料理,顾二维数组的原材数量最多25*50=1250
int main()
{
int i=0,c=1; -------------------------------------------------- //c 用来计数(最少一种原材),一种原材都没有,是不能做料理的
scanf("%s",material[0]);
for(i=1;i<1250;i++){ ------------------------------------------- //循环至多1249次。
if(scanf("%s",material[i])==EOF){break;} -------------------- //输入EOF时是结束标准 material[i]没有存入东西,并且 scanf返回值是-1,EOF也是-1;所以条件成立,结束循环。
if(material[i]==EOF){break;}
else{
c++;----------------------------------------------------- //没有结束,计数加1
for(int j=0;j<i;j++){
if(!strcmp(material[i],material[j])){c--;break;} -----//判断重复,如果重复,前面的+1在取消 则需要-1并退出改循环
}
}

}
printf("%d\n",c);
      return 0;

}
最后回复下; 将scanf("%s",material[i])放到if的前面,结果会大1.
在vs2019中,该代码无法推出循环,
而在牛客网中运行,是结果大一。
推论是牛客网的编译环境,在输入EOF后,将EOF当成一道原材进行计算,顾结果加1,然后程序自己强行推出,最后结果是大1.