作为一名初学者,必须能经得住前人们的成果诱惑。
比如本题,开始没理解题意很苦恼,于是去搜博客,发现大多都是使用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;
}