洛谷P1308统计单词数,strtok函数的使用以及对于单词分割的一些思考
[NOIP2011 普及组] 统计单词数
题目描述
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例 1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例 2)。
输入格式
共 \(2\) 行。
第 \(1\) 行为一个字符串,其中只含字母,表示给定单词;
第 \(2\) 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式
一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 \(0\) 开始);如果单词在文章中没有出现,则直接输出一个整数 \(-1\)。
样例 #1
样例输入 #1
To
to be or not to be is a question
样例输出 #1
2 0
样例 #2
样例输入 #2
to
Did the Ottoman Empire lose its power at that time
样例输出 #2
-1
提示
数据范围
$1\leq $ 第一行单词长度 \(\leq10\)。
$1\leq $ 文章长度 \(\leq10^6\)。
noip2011 普及组第 2 题
————————————————————————————————————————————————————以上为题目
这道题的恶心点在于如何比较以及如何记录当前单词的位置,可以知道题目要求不论大小写的比较,因此我们必须将模式串和比较串统一大写或者统一小写然后调用strcmp函数来比较两者是否完全一至。
然后就是如何分割出单词,这里使用string库里的strtok函数
其定义如下
char *strtok(char *str, const char *delim);
其中Str为要被分割的字符串,delim为作为分割符的字符串
strtok函数会根据delim里的每一个单字符作为分隔符,将Str分割
strtok在切割字符串的时间,实际上就是将分割符的字符delimiter替换为'\0'并且返回首地址。
例如
点击查看代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<stdbool.h>
int main()
{
char S[50] = { " ABC DEF GH QEL" };
char Del[2] = " ";
char* K = strtok(S, Del);
while (K != NULL)
{
printf("%s %d", K, K - S);
K = strtok(NULL, Del);//第二次调用要传入NULL,用来定位下一次的切割
}
return 0;
}
strtok函数的作用原理是strtok会从传入的字符指针开始向后扫瞄直到找到第一个非Del字符里的字符并标记为初始位置不妨叫他为Str,他是一个字符指针,此位置即为最后返回值。然后继续向后扫瞄直到找到Del字符里的字符为止,strtok会将这个字符直接在原字符串里替换为\0,然后返回Str这个字符指针,因此调用strtok会将原字符串改变。当找到末尾时,strtok回返回NULL,若在模式串中找不到分隔符,则直接原地返回字符串的首地址。
注意第二次分割参数传入NULL
因此借用strtok,我们可以以空格为分隔符来将单词分割出来并且得知其首字母在原字符串中的指针位置K,我们只需要让K减去模式串的首地址即可得知这个单词在模式串中的位置
有如下代码
点击查看代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<stdbool.h>
bool MyStrcmp(char* S, char* Pattern)
{
int i;
for (i = 0; S[i] && Pattern[i]; i++)
{
if (S[i] == Pattern[i] || S[i] - 32 == Pattern[i] || S[i] + 32 == Pattern[i])
continue;
else
break;
}
if (!S[i] && !Pattern[i])
return 1;
else
return 0;
}
int main()
{
char S[10];
scanf("%s", S);
char Pattern[1000000];
getchar();
gets(Pattern);
int cnt = 0;
int Position = -1;
char Del[2] = " ";
char* K = strtok(Pattern, Del);
while (K != NULL)
{
if (MyStrcmp(S, K))
{
cnt++;
if (Position == -1)
Position = K - Pattern;
}
K=strtok(NULL, Del);
}
if (Position != -1)
printf("%d %d", cnt, Position);
else
printf("-1");
return 0;
}
这里使用的逐个字母枚举比较,当然也可以将字符串全部转换为大写或者小写然后strcmp
大小写转换可以使用函数toupper(char c)//将字符c转换为大写,tolower(char c)//将字符c转为小写,不过这是单字符的转换,可以使用循环将字符串里的字母统一大小写
洛谷P1308统计单词数,strtok函数的使用以及对于单词分割的一些思考的更多相关文章
- 洛谷 P1308 统计单词数
P1308 统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定 ...
- 洛谷 P1308 统计单词数【string类及其函数应用/STL】
题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给 ...
- (水题)洛谷 - P1308 - 统计单词数
https://www.luogu.org/problemnew/show/P1308 简单哈希一下判断,练练手. 注意fgets()的用法,第一个参数传存储位置,第二个参数传内存上限,第三个传std ...
- 洛谷P1308 统计单词数
原题链接:https://www.luogu.org/problem/P1308 #include<iostream> #include<cstring> #include&l ...
- java实现洛谷P1308统计单词数
题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给 ...
- 洛谷 P1308 统计单词数【字符串+模拟】
P1308 统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定 ...
- P1308 统计单词数
P1308 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请 ...
- 字符串--P1308 统计单词数
题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给 ...
- 洛谷 P1308 统计单词数【字符串处理】
题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给 ...
- P1308 统计单词数(cin,getline() ,transform() )
题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给 ...
随机推荐
- <vue初体验> 基础知识 4、 vue的生命周期
系列导航 <vue初体验> 一. vue的引入和使用体验 <vue初体验> 二. vue的列表展示 <vue初体验> 三. vue的计数器 <vue初体验&g ...
- uniapp#实现自定义省市区三级联动
uni-APP中的三级联动(省市区)---数据前端写死 https://blog.csdn.net/lwaner/article/details/107150805 uniapp#实现自定义省市区三级 ...
- java基础(4)--javadoc文档与命令
一.Javadoc文档 javadoc是Sun公司提供的一个技术,它从程序源代码中抽取类.方法.成员等注释形成一个和源代码配套的API帮助文档.也就是说,只要在编写程序时以一套特定的标签作注释,在程序 ...
- java基础-流程控制-day04
目录 1. if单分支 2. if else 多分支 3. if else双分支 4. 随机生成一定区间的整数 5 switch语句 6. while循环 7. for循环 8. break cont ...
- python3之lambda表达式
技术背景 lambda表达式本身是一个非常基础的python函数语法,其基本功能跟使用def所定义的python函数是一样的,只是lambda表达式基本在一行以内就完整的表达了整个函数的运算逻辑.这里 ...
- Java开发者的Python快速进修指南:探索15种独特的Python特殊方法
概述 在Python中,特殊方法(也称为魔术方法)是由Python解释器自动调用的,我们不需要手动调用它们,而是使用内置函数来间接地使用它们.举个例子,我们可以实现特殊方法__len__(),然后通过 ...
- 如何让你的.NET WebAPI程序支持HTTP3?
下面我将总结构建Http3的经验,以Token Gateway的项目为例,请注意使用Http3之前你需要知道它的限制, Windows Windows 11 版本 22000 或更高版本/Window ...
- [转帖]Run Grafana behind a reverse proxy
On this page Introduction Configure NGINX Configure HAProxy Configure IIS Configure Traefik Summary ...
- [转帖]linux中批量多行缩进与添加空格
用vim打开修改python脚本的时候,将代码整体向后移动4个空格操作如下: ESC之后,ctrl+v进入多行行首选中模式 使用上下键进行上下移动,选中多行行首 shift+i,进入插入模式 连续敲击 ...
- [转帖]Linux_Redhat8——常用命令:ls、ll、vim、ps、top、grep、tail
Linux_Redhat8-常用命令: ls.ll.vim.ps.top.grep 一.ls(list):查看目录下的文件 ls:仅罗列出当前文件名或目录名. ll:罗列出当前文件或目录的详细信息,包 ...