C--str系列函数和codevs题目分享

C语言中str系列函数有很多,上学期C课本中学习的只是其中一部分,还有一些不太熟悉的这里也一并记录一下~
1、strcat()
此函数原型为 char *strcat(char *dest, const char *src).
功能为连接两个字符串,把src连接到dest后面;返回dest地址
实现如下

2、strcmp()
此函数的函数原型为 int strcmp(const char *str1, const char *str2).
功能为比较两个字符串。
当str1指向的字符串大于str2指向的字符串时,返回正数。
当str1指向的字符串等于str2指向的字符串时,返回0。
当str1指向的字符串小于str2指向的字符串时,返回负数。

3、strcpy()
此函数原型为 char strcpy(char dest, const char *src)
功能为拷贝字符串内容到目的串,把src所指向的内容拷贝到dest
实现如下

4、strlen()
此函数原型为unsigned in strlen(const char *str)
功能为返回字符串str的长度(不包括’\0’)。

***5、strchr() strrchr()
char *strchr(char *str, char c)
功能为查找str中首次出现c的位置,如有有,则返回出现位置,否则返回NULL。实现如下:
char *strchr(char *str, char c)
{
while(*str!=’\0’&&*str!=c)
{
str++;
}
return (*str==c? str: NULL);
}

char *strrchr(char *str, char c)
== 功能为查找str中最后一次出现c的位置,如有有,则返回出现位置,否则返回NULL。==
实现如下:
char *strrchr(char *str, char c)
{
char *p=str+strlen(str);//p指向最后一个字符
while(p!=str&&*p!=c)
p–;
if(p==str&&*p!=c)
return NULL;
else return p;
}

6、strcspn() strspn()
strcspn
原型:size_t strcspn(const char *s, const char *reject)
函数说明:strcspn()从参数s 字符串的开头计算连续的字符, 而这些字符都完全不在参数reject所指的字符串中.
简单地说, 若strcspn()返回的数值为n, 则代表字符串s 开头连续有n 个字符都不含字符串reject内的字符.
范例
#include <string.h>
main()
{
char *str = “Linux was firstdeveloped for 386/486-based pcs. “;
printf(”%d\n”, strcspn(str, “”));
printf("%d\n", strcspn(str,"/-"));
printf("%d\n", strcspn(str,“1234567890”));
}
strspn
表头文件 #include<string.h>  
定义函数 size_t strspn (const char *s,const char * accept);
函数说明 :strspn()从参数s 字符串的开头计算连续的字符,而这些字符都完全是accept所指字符串中的字符。
简单的说,若strspn()返回的数值为n,则代表字符串s 开头连续有n个字符都是属于字符串accept内的字符。  
返回值: 返回字符串s开头连续包含字符串accept内的字符数目。
7、strdup()
此函数原型为char *strdup(const char *str)
功能为拷贝字符串到新建的内存,返回内存指针。若失败,返回NULL。要注意,返回的指针指向的内存在堆中,所以要手动释放。
函数实现:
char *strdup(const char *str)
{
char p=NULL;
if(str&&(p=(char
)malloc(strlen(str)+1)))
strcpy(p,str);
return p;
8、strrev()
此函数的原型为char *strrev(char *str)
功能为反转字符串,返回字符串指针。
函数实现:
char *strrev(char *str)
{
if(str==NULL)
return NULL;
char *start=str;
char *end=str+strlen(str)-1;
char temp;
while(start<end)
{
temp=*start;
*start=*end;
*end=temp;
start++;
end–;
}
return str;
}
9、strstr()
函数原型为char *strstr(const char str1, const char *str2)
功能为查找字符串str2在str1中出现的位置,找到则返回位置,否则返回NULL。
函数实现:
注意:这里返回的不是位置值,而是返回从从找到位置开始直到字符串结尾的字符串,相当于一个指针变量。
char *strstr(const char str1, const char *str2)
{
int length1=strlen(str1);
int length2=strlen(str2);
while(length1>=length2)
{
length1–;
if(!strncpy(str1,str2,length2))//比较前n个字符串,类似strcpy
return str1;
str1++;
}
return NULL;
}

顺便分享一道我刚做的题,用到了strstr函数:
题目:codevs 1131 统计单词数
题目链接:http://codevs.cn/problem/1131/
我的大致思路:
1.首先假设待查找的字符串(第一个)为s1,被查找的(第二个长的)字符串为s2。
2.题目要求如果在s2中找不到s1,就输出-1。显然这里在输入两个字符串后,先用strstr(s2,s1)判断s2中是否含有s1,如果strstr(s2,s1)返回的值为空,那么输出结果一定为-1。这是最容易判断出来的一种情况。
3.emmmm其实一开始我以为只有2中所说的情况结果为-1,其实是我想简单啦,还有别的情况:因为题中强调了:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2)。* 也就是说,如果S2中只是含有S1中的所有字母,但不是完全匹配,结果也应该是-1,但在第一个判断条件中并不会返回NULL,这就需要之后的代码中添加更多的限制。
4.放一张手写分析图:
在这里插入图片描述

注意:
1.我觉得这个题的难点在于判断完全匹配的条件限制比较多,首先要满足s2
查找到s1字符串之后的第一个字符为空格,同时在s2中出现的s1的首字母字符的前一个字符也是空格。
2.之前说到了输出-1的情况不止一种,应在遍历的循环后面再加一个判断条件,如果总数为0,那么直接输出-1.
代码:


#include<stdio.h>
#include<string.h>
#define N 2000000
int main()
{
	char s1[50],s2[N];
	int m[10002];
	int i,j,k,p,len1,t=0;
	long int len2;
	gets(s1);
	len1=strlen(s1);
	gets(s2);
	len2=strlen(s2);
	for(i=0;i<len1;i++)
		if(s1[i]>='A'&&s1[i]<='Z')
		    s1[i]+=32;
	for(i=0;i<len2;i++)
	    if(s2[i]>='A'&&s2[i]<='Z')
	        s2[i]+=32;
//	printf("%s\n%s\n",s1,s2);
	if(strstr(s2,s1)==NULL)
	{
	  printf("-1\n");
	  return 0;
    }
	else
	  {
	  	p=0;
		for(i=0;i<len2;i++)
		{
			if(s2[i]==s1[0])
			{
				k=i;
			    for(j=0;j<len1;j++)
				{
					if(s2[k++]!=s1[j])
					  break;
				}
				if(j==len1&&s2[k]==' '&&s2[k-len1-1]==' ')
				{
					m[p++]=k-len1;
					t++;
					i=k;
				}	
			}
		 } 
		 if(t==0)
		   printf("-1\n");
		 else
		   printf("%d %d\n",t,m[0]);
	  }
}

总觉得我的思路还是有点点麻烦了,接下来会了解一下是否有更好更快的解题方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值