字符串的查找是先输入语句,将之保存,然后再输入,查找它出现了多少次,看似简单,但对初学者而言却是一个不小的考验,若能研究透彻,实乃洗髓。
首先,开始这个项目时另建两个文件并将其命名为myString.h和myString.cpp,其中,myString.h中添加函数标题,myString.cpp中添加函数的实行,原本的main.cpp中书写函数的结构。而后定义一个数组,保存所要写的内容。
由于是查找字符串,因此我们可以在main函数书写的内容便是定义保存的数组,提示,输入字符串,输入查找的字符串,输出出现的次数。
int main( ){
char sentence[100] = { };
char word[20] = { };
input(sentence,"请输入语句");
input(word,"请输入查找的单词");
int count = find(sentence,word);
printf("你查找的单词出现次数为:%d",count);
return 0;
}
而后在mystring.cpp里面完善输入流程,即是
void input(char *p,char *des){
printf("%s",des);
printf("%s",p);
scanf("%s",p);
getchar( );
}
之后将find函数进行完善,而进行比较时需要判断字长,如果输入语句的字长还没有查找语句的长,就不需要再进行比较了,直接为0次,因此可得
int sLength = length(sentence);
int wLength = length(word);
if(sLength < wLength){
return 0;
}
如果输入语句字长比查找语句长的话,便需要从头开始进行比较,如果有相同的就依次进行比较,完全相同就记一次,然后从比较完时的那个数的下一个数开始进行下一轮比较,如果不是完全相同,就是从比较的那个数的下一个数开始进行比较。于是便有:
int count = 0;
int start = 0;
for(int i = 0;i < sLength;i++){
start = i;
int j = 0;
for(;j < wLength;j++){
if(sentence[start + j] != word[j]){
break;
}
}
if(j == wLength){
i = start + j - 1;
count++;
}
}
在做完这些觉得可以结束时,你就漏了一个弊端,由于scanf具有的局限性,因此,我们需要自己定义一个方法加以完善。
void myScanf(char *p){
int i = 0;
while(1){
char c = getchar ();
if(c == '\n'){
p[i] = '\0';
break;
}
p[i] = c;
i++;
}
}
当然如果想不浪费空间保存可以使用指针进行保存,
char *inputName(){
char *pName = NULL;
int i = 0;
printf("请输入");
while (1) {
char c = getchar();
if (c == '\n') {
break;
}
if(i == 0){
pName = (char *)malloc(1*sizeof(char));
if(pName == NULL){
exit(EXIT_FAILURE);
}
pName[0] = c;
}else{
pName = realloc(pName, (i+1)*sizeof(char));
if(pName == NULL){
exit(EXIT_FAILURE);
}
pName[i] = c;
}
i++;
}
return pName;
}