字符串日常tip/problem
文章目录
一、字符串函数
10.29遇到了strcmp的平替
他喵的这个题让我自己写代码执行strcmp的功能
先淡定的复习一下strcmp
1.strcmp的使用
int strcmp(const char * s1,const char * s2);
根据ASCII码比较字符串
如果s1字符串在机器排序序列中位于s2字符串的后面,该函数返回一个正数;如果两个字符串相等,则返回0;如果s1字符串在机器排序序列中位于s2的前面,该函数返回一个负数。
对这段我比较蒙啊,机器排序序列??什么东西鸭。然后我决定自己写个代码探索一下。
#include<stdio.h>
#include<string.h>
int main()
{
char s1[127],s2[127];
int i;
scanf("%s %s",s1,s2);
i=strcmp(s1,s2);
printf("%d",i);
}
比较的就是两者ASCII码值的大小。
前>后,则返回一个正数,一般就是1啦;前=后,返回0;前<后,返回负数,一般就是-1;
2.自己编写程序实现strcmp
题目:
由键盘输入两个长度不超过100的字符串,比较其是否相同,若相同则输出YES,否则输出NO。
(说明:相同意味着长度相同并且同一位上的字符相同。不能使用任何字符串处理函数)
输入输出说明:
输入:ABC ABC
输出:YES
#include<stdio.h>
bool strcmp(char *s1,char *s2)
{
int n1,n2,i;
for(i=0;s1[i]!=0;i++)/*统计第一个字符串的长度*/
n1=i;
for(i=0;s2[i]!=0;i++)/*统计第二个字符串的长度*/
n2=i;
if(n1!=n2)
return false;
for(int i=0;i<101;i++)
{
if(s1[i]!=s2[i])
return false;
}
return true;
}
int main()
{
char s1[101]={'\0'},s2[101]={'\0'};
scanf("%s %s",s1,s2);
if(strcmp(s1,s2))
printf("YES");
else
printf("NO");
}
王总的代码贼高级!
#include<stdio.h>
int main()
{
int i;
char s1[101]={'\0'},s2[101]={'\0'};
scanf("%s %s",s1,s2);
for(i=0;i<101;i++)
{
if(s1[i]!=s2[i])
{
printf("NO");
return 0;
}
if(s1[i]=='\0'&&s2[i]=='\0')//同时结尾表示长度相同
{
printf("YES");
return 0;
}
}
return 0;
}
根据函数原型。标准的平替应该如下;
#include<stdio.h>
#include<assert.h>
int mystrcmp(const char *s1,const char *s2)
{
assert(s1!=NULL && s2!=NULL);
while(*s1&&*s2&&(*s1==*s2))
{
s1++;
s2++;
}
return *s1-*s2;
}
int main()
{
char s1[101]={'\0'},s2[101]={'\0'};
scanf("%s%s",s1,s2);
int i=mystrcmp(s1,s2);
if(i>0)
printf("no,s1大");
else if(i<0)
printf("no,s2大");
else
printf("yes");
return 0;
}
10.30遇到了strchr
1.strchr的使用
char * strchr(consit char * s,char c);
如果s字符串中包含c字符,该函数返回指向s字符串首位置的指针(末尾的空字符也是字符串的一部分,所以在查找范围内);如果在字符串s中未找到c字符,该函数返回空指针。
11.1遇到了strcat的平替
1.strcat的使用
char*strcat(char* restrict s1,const char * restrict s2)
strcat()(用于拼接字符串)函数接收两个字符串作为参数。该函数把第二个字符串的备份附加在第一个字符串末尾,并把拼接后的新字符串作为第一个字符串,第二个字符串不变。strcat()函数的类型是char*(即,指向char的指针),strcat()函数返回第一个参数,即拼接第二个字符串后的第一个字符串的地址。s2字符串的第一个字符将覆盖s1字符串末尾的空字符。
就这么用!
2.自实现strcat字符串处理函数
#include<stdio.h>
char * replace(char *s1,char*s2)
{
char * temp=s1;
while(*temp)
temp++;//找到s1的末尾
while(*temp++=*s2++);
return s1;
}
int main()
{
char s1[127],s2[127];
scanf("%s %s",s1,s2);
printf("%s",replace(s1,s2));
}
#include<stdio.h>
char *mystrcat(char *s1,char *s2)
{
assert(NULL != s1 && NULL != s2);//如果条件不满足,则终止程序
char *temp=s1;
while(*temp!='\0')
temp++;//while循环出来temp指向原字符串的NULL空字符的位置
while(*s2!='\0')
*temp++=*s2++;
return s1;
}
int main()
{
char s1[127],s2[127];
scanf("%s%s",s1,s2);
printf("%s",mystrcat(s1,s2));
}
11.20遇到了strlen的平替(并非偶遇事件
1.strlen的使用
函数原型
size_t strlen( const char *string );
功能:计算字符串长度,不包含’\0’
返回值:返回字符串的字符数
2.自实现strlen字符串处理函数
#include<stdio.h>
int mystrlen(const char *s)
{
if(s==NULL)
return 0;
int len=0;
while(*s)
{
len++;
s++;
}
return len;
}
int main()
{
char s[]={'\0'};
scanf("%s",s);
printf("%d",mystrlen(s));
return 0;
}
11.20遇到了strcpy(并非偶遇事件
1.strcpy的使用
函数原型
char* strcpy(char* dest,char* src)
功 能: 将参数src字符串拷贝至参数dest所指的地址
返回值: 返回参数dest的字符串起始地址
2.自实现strcpy字符串处理函数
#include<stdio.h>
char * mystrcpy(char *dest,const char*src)
{
if(dest==NULL ||src==NULL)
return NULL;
char *ptr=dest;//保存字符串初始地址
while(*src)
{
*ptr++=*src++;
}
*ptr='\0';//末尾添加结束符
return dest;
}
int main()
{
char s1[]={'\0'};
char s2[101]={'\0'};//s2必须定义大小。因为s2是被读的那个。
scanf("%s%s",s1,s2);
mystrcpy(s1,s2);
printf("%s",s1);
return 0;
}
2.自实现strcnpy字符串处理函数
1)将以字符串src所指向的地址开始的前n个字节复制到dest中,并返回dest
2)如果src的前n个字符不含NULL结束符,则dest不会以NULL字符结束
3)如果n>strlen(src)+1,则以’\0’填充dest,直到复制完n个字节
4)src和dest所指内存区域不可以重叠且dest必须有足够的空间(sizeof(dest)>=strlen(src)+1)来容纳src的字符串
5)dest和n应该满足:sizeof(dest)>=n
#include<stdio.h>
#include<assert.h>
char *strncpy(char *dest,char *src,unsigned int n)
{
assert(NULL!=dest && NULL!=src);
char *temp=dest;
while(n>0&&*src!='\0')
{
*temp++=*src++;
--n;
}
if(n>0)
{
*temp='\0';
}
return dest;
}
int main()
{
char s1[127],s2[127];
scanf("%s%s",s1,s2);
printf("%s",strncpy(s1,s2,6));
}
9-7 使用函数实现字符串部分复制 (20分)
本题要求编写函数,将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。
函数接口定义:
void strmcpy( char *t, int m, char *s );
函数strmcpy将输入字符串char *t中从第m个字符开始的全部字符复制到字符串char *s中。若m超过输入字符串的长度,则结果字符串应为空串。
#include<string.h>
void strmcpy( char *t, int m, char *s )
{
int i,j,cnt=strlen(t);
if(m>cnt)
*s=NULL;
for(i=m-1,j=0;i<cnt;i++,j++)
{
s[j]=t[i];
}
s[j]='\0';//在字符串最后加上\0表示字符串结束
}