Description
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例 1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例 2)。
Input
共 22 行。
第 11 行为一个字符串,其中只含字母,表示给定单词;
第 22 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
Output
一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 00 开始);如果单词在文章中没有出现,则直接输出一个整数 −1−1。
注意:空格占一个字母位
Sample 1
Input:
To
to be or not to be is a question
out:
2 0
Sample 2
Input:
to
Did the Ottoman Empire lose its power at that time
Output:
-1
Hint
数据范围
1≤1≤ 第一行单词长度 ≤10≤10。
1≤1≤ 文章长度 ≤106≤106。
noip2011 普及组第 2 题
笔者答案:
#include<stdio.h>
#include<string.h>
int main()
{
char word[15];//装单词
char sentence[1000001];//装句子
char sentencep[1000005]="s";
char wordp[20]="w";
int i,j;//用于循环
int k=0;//用于拷贝数组的计数
int a,b;//移动的截点
char cunf[20];//用于装从句子中取出的单词
int flag=0;//没找到对应单词则为0,反之为1
int cnt=0;//出现次数
int weizhi;//出现位置
gets(word);
gets(sentence);
for(i=0;word[i]!='\0';i++)//小写化
{
if(word[i]>='A'&&word[i]<='Z')
{
word[i]+=32;
}
}
for(i=0;sentence[i]!='\0';i++)//小写化
{
if(sentence[i]>='A'&&sentence[i]<='Z')
{
sentence[i]+=32;
}
}
strcpy(wordp+1,word);
strcpy(sentencep+1,sentence);
wordp[0]=' ';
wordp[strlen(wordp)]=' ';
wordp[strlen(wordp)+1]='\0';
sentencep[0]=' ';
sentencep[strlen(sentencep)]=' ';
sentencep[strlen(sentencep)+1]='\0';
a=0,b=strlen(wordp)-1;
for(;sentencep[b]!='\0';a++,b++)
{
for(i=a;i<=b;i++)//把长度为ab的字符串拷出来
{
cunf[k++]=sentencep[i];
}
cunf[k]='\0';
if(strcmp(cunf,wordp)==0&&flag==0)
{
flag=1;
cnt++;
weizhi=a;
}
else
{
if(strcmp(cunf,wordp)==0&&flag==1)
{
cnt++;
}
}
k=0;
}
if(flag==0)
{
printf("-1");
}
else
{
printf("%d %d",cnt,weizhi);
}
return 0;
}
收获:
1.字符串中的未赋值的元素(乱码)可能会覆盖赋了值的元素
2.只有字符串函数才能使用字符串函数,否则容易报错
3.strcpy会把'\0'一起拷贝
4.数组名报错(数组名和变量名重合)
5.字符串的初始化: