作为一名初学者,必须能经得住前人们的成果诱惑。

比如本题,开始没理解题意很苦恼,于是去搜博客,发现大多都是使用C++的容器解决的,这个东西当然是很棒的,但是就像以小学生的思维去看待小学题目一样,可能我们只能暴力枚举,而随着不断的学习,之后的定理可以轻松解决这些。

所以作为个人的入门语言,事实上是很喜欢C的。这门语言并没有给你很多函数,大部分你都需要自我理解手敲出来,不像java有点类似于仓库一样,随用随取。我更喜欢这题纯是靠自我的思维去解决问题。

说来也是很难受的,毕竟这题debug了很久,迟迟找不到错误点,最后发现是不允许两个重复的单词出现。那么就可以在将单词放入新开的空间前进行判断,若存在一样的单词,就不放了,本题strcmp和strcpy用的恰到好处。

下面贴个代码

#include<stdio.h>
#include<string.h>
int main()
{
	char s[1000] = "";
	while(gets(s) && strcmp("#", s) != 0){
		
		char let[105][105] = {'\0'};
		char temp[105];
		int len = strlen(s);
		int rectep = 0;
		int flag = 1;
		
/*		for(int i = 0; i < len; i++)    这里是刚开始没理解时, 
			if(s[i] == '#')		        以为'#'是作为字符串中的一部分截止的,
				s[i] = '\0';			没想到是像EOF一样作为所有字符串输入截止的标志而存在的, 
		len = strlen(s);				即输入了'#'那么就什么都不处理,return 0;
										就行了 
*/
		
		for(int i = 0; i < len; i++){
			memset(temp, '\0', sizeof(temp));
			int k = 0;
			if(s[i] >= 'a' && s[i] <= 'z'){
				while(s[i] != ' ' && s[i] != '\0'){ //当这个单词是最后一个时,可能会不出现空格,那么就出现结束标志 
					temp[k] = s[i];   //将单词输入至temp中 
					k++;
					i++; 
				}
				temp[k] = '\0';
				if(k > 0){ //只有这次的单词存在了,才会进行判断和存放 
					flag = 1;
					for(int j = 0; j <= rectep; j++)
					if(strcmp(let[j], temp) == 0){ 
						flag = 0;
						break;
					}
				}
					if(flag)
						strcpy(let[rectep++], temp);	
			}
		}
		printf("%d\n", rectep);
	}
	return 0;
}