在字符串的计算部分,C语言函数库里面有很多处理字符串的函数,下面我们就介绍一些关于字符串处理函数的用法。具体包含字符串的输入输出getchar与putchar,还有string.h中的strlen、strcmp、strcpy、strcat、strchr、strstr等函数。
1. getchar与putchar函数
putchar函数
int putchar(int c);
向标准输出写一个字符,返回写了几个字符,可以返回EOF(-1)表示写失败。
getchar函数
int getchar(void)
返回类型是int是为了返回EOF(-1)。
Windows结束ctrl+z
Unix结束用 ctrl+D
例1:输入输出
int main(int argc,char const *argv[])
{
int ch;
while((ch=getchar())!=EOF) //将getchar的内容赋值给ch,判断是否为EOF
{
putchar(ch); //如果不是EOF,则输出这个字符串
}
printf("EOF\n"); //如果输人结束,输出EOF
return 0;
}
运行结果:
输入字符串 输入ctrl+z
2. strlen函数
size_t strlen(const char *s);
返回s的字符串长度(不包括结尾的0),这里使用了const,表示不修改字符串的长度。
例2:字符串长度
#include<stdio.h>
#include<string.h>
int main(int argc,char const *argv[])
{
char line[]="hello";
printf("strlen=%lu\n",strlen(line));
printf("sizeof=%lu\n",sizeof(line));
return 0;
}
运行结果:
由于字符串hello是五个字符,所以显示的结果是5,而sizeof是表示数组需要占据6个字符,因为字符串结尾还有一个\0。
还有一种方式是遍历计数,当遍历到\0结束计数,就能得到字符串长度。
int mylen(const char *s)
{
int idx=0;
while(s[idx]!='\0')
{
idx++;
}
return idx;
}
3. strcmp函数
int strcmp(const char *s1,const char *s2);
比较两个字符串,比较的是字符在ASCII码表中的位置,返回:
0:表示s1==s2
1:表示s1>s2
-1:表示s1<s2
例3:字符串比较
#include<stdio.h>
#include<string.h>
int main(int argc,char const *argv[])
{
char s1[]="abc";
char s2[]="Abc";
printf("%d\n",strcmp(s1,s2));
if(strcmp(s1,s2)==0)
printf("s1==s2");
else if(strcmp(s1,s2)==1)
printf("s1>s2");
else if(strcmp(s1,s2)==1)
printf("s1<s2");
return 0;
}
我们也可以用遍历数组的方式进行字符串的比较:
int mycmp(int argc,char const *argv[])
{
int idx=0;
while(s1[idx]==s2[idx]&&s1[idx]!='\0')
{
idx++;
}
return s1[idx]-s2[idx];
}
除了数组,还可以用指针:
while(*s1==*s2&&*s1!='\0')
{
s1++;
s2++;
}
return *s1-*s2;
4. strcpy函数
chat *strcpy(char *restrict dst,const char *restrict src);
表示把src的字符串复制到dst,restrict表示src与dst在内存中不重叠,返回dst。
在我们复制一个字符串的时候需要使用malloc来申请一个动态内存,大小为
strlen(src)+1.
char *dst=(chat*)malloc(strlen(src)+1);
strcpy(dst,strc);
例4:字符串复制
int main(int argc,char const *argv[])
{
char s1[]="abc";
char s2[]="Abc";
strcpy(s1,s2);
return 0;
}
也可以使用数组遍历来完成字符串复制:
char* mycpy(char *dst,char const *src)
{
int idx=0;
while(src[idx]!='\0')
{
dst[idx]=src[idx];
idx++;
}
dst[idx]=’\0’;
return dst;
}
5. strcat函数
char *strcat(char *restrict s1,const char *restrict s2);
将s2拷贝到s1的后面,接成一个长的字符串,返回s1,需要s1有足够的空间。
这里需要注意的是,对于strcpy与strcat都存在安全问题,需要字符串数组内存足够大才行。
6. 字符串搜索函数
① 字符串中找字符
char *strchr(const char *s,int c);
表示从左边开始找字符,返回指针。
char *strrchr(const char *s,int c);
表示从右边开始找字符,返回指针。
返回NULL表示没有找到。
例5:寻找第二个字符
#include<stdio.h>
#include<string.h>
int main(int argc,char const *argv[])
{
char s[]="hello";
char *p=strchr(s,'l'); //找到第一个l所在的位置,返回指针
p = strchr(p+1,'l'); //在p+1的指针后寻找l,也就是第二个l的位置
printf("%s\n",p); //输出的是第二个l所在位置指针后面的内容
return 0;
}
② 字符串中寻找字符串
char *strstr(const char *s1,const char *s2);
字符串中进行字符串查询。
char *strcasestr(const char *s1,const char *s2);
忽略大小写进行字符串查询。