C语言--字符串函数

字符串:字符串是以空字符(\0)结尾的char类型数组,C语言中一种非常重要的数据类型。

字符串常量(字符串字面量):

由一对双引号括起来的多个字符的序列,比如:“3gniubi”

字符串数组:

首先看这个例子:char a[8]={'3','g','n','i','u','b','i‘};这并不是一个字符串,只是一个字符数组;

正确写法:char a[8]={'3','g','n','i','u','b','i','\0'};

字符串输入:

最常用的两种:gets()和scanf("%s",  )

区别:在读取字符串时,scanf()和转换说明%s只能读取一个单词。而gets则可以读取一整行的的输入。

#include<stdio.h>
int main()
{  //输入“3g niubi”这个字符串 
    char a[10];
	gets(a);
	printf("%s\n",a);
	char b[10];
	scanf("%s",&b); 
	printf("%s\n",b);
	return 0;
 } 

输出结果:

字符串的输出:

最常用的两种:puts(),printf("%s",   );

区别:puts()会在输出结果后面加一个换行符。

示例:

#include<stdio.h>
int main()
{
	char a[]="abc";
	printf("%s",a);
	printf("%s",a);
	puts(a);
	puts(a);
	return 0;
 } 

输出结果:

字符串函数:

1.strlen()

用法:计算字符串有效长度,字符串有效长度指的是字符串中’\0’之前的字符个数,不包括’\0’

strlen和sizeof区别?

strlen是一个来计算字符串长度的函数,遇到第一个“\0”终止;

sizeof是一个运算符,用来计算变量或者对象、类型所占字节的多少;

示例:

#include<stdio.h>
#include<string.h>
int main()
{
	char a[]="3gniubi";
	int b=strlen(a);
	int c=sizeof(a);
	printf("%d\n",b);
	printf("%d\n",c);
    return 0;
 } 

输出结果:

自己定义一个函数mystrlen,来实现strlen函数的功能:

int mystrlen(char*a)
{
	int i=0;
	while(a[i]!=0)
	{
		i++;
	}
	return i;
}

测试函数:

#include<stdio.h>
int mystrlen(char*a)
{
	int i=0;
	while(a[i]!=0)
	{
		i++;
	}
	return i;
}
int main()
{
	char *a="3g\0niubi";
	int c=mystrlen(a);
	printf("%d",c);
    return 0;
}

运行结果:

 习题:

int main()
{
char b[]= "Hello\0,3g\0";
char* a = b;
char c[255] = {0};
printf("strlen(b) = %d\n", strlen(b));
printf("sizeof(b) = %d\n", sizeof(b));
printf("strlen(a) = %d\n", strlen(a));
printf("sizeof(a) = %d\n", sizeof(a));
printf("strlen(c) = %d\n", strlen(c));
printf("sizeof(c) = %d\n", sizeof(c));
return 0;
}

2.strcat()函数和strncat()函数

strcat函数用于拼接字符串,接收两个字符串作为参数,把第二个字符串附加在第一个字符串末尾,并把拼接后的新字符串作为第一个字符串,第二个字符串不变。

示例:

#include<stdio.h>
#include<string.h>
int main()
{
	char a[]="3g";
	char *b="niubi";
	char *c=strcat(a,b);
	printf("%s",c);
    return 0;
 } 

输出结果:

strncat函数用法和strcat函数类似,不同的是strncat可以控制第二个字符串拼接的长短。

示例:

#include<stdio.h>
#include<string.h>
int main()
{
	char a[]="3g";
	char *b="niubi";
	char *c=strncat(a,b,3);
	printf("%s",c);
    return 0;
 } 

输出结果:

 注意:在调用strcat函数的时候,前一个字符串一定是字符串数组形式,第二个字符串是字符串常量。

错误示例:

#include<stdio.h>
#include<string.h>
int main()
{
	char *a="3g";
	char *b="niubi";
	char *c=strcat(a,b);
	printf("%s",c);
    return 0;
 } 

程序在char*c=strcat(a,b);时已经坏掉因此并没有输出结果。

在函数原型中:很明显可以看出第一个字符串是char*类型,第二个是const char*类型。

因此我们在自己定义strcat()函数时,这一点同样至关重要

char* mystrcat(char* str1, const char* str2) {
	int i = 0;
	int len = strlen(str1);
	while (str2[i]) {
		str1[len] = str2[i];
		i++;
		len++;
	}
	str1[len] = 0;
	return str1;
}

测试函数:

#include<stdio.h>
#include<string.h>
char* mystrcat(char* str1, const char* str2) {
	int i = 0;
	int len = strlen(str1);
	while (str2[i]) {
		str1[len] = str2[i];
		i++;
		len++;
	}
	str1[len] = 0;
	return str1;
}

int main()
{
	char a[]="3g";
	char *b="niubi";
	char *c=mystrcat(a,b);
	printf("%s",c);
 } 

输出结果:

3.strcmp()函数

用法:比较两个字符串的大小,自左向右逐个比较ascii码值的大小,直到出现大小不同的两个字符,如果前面字符大,则返回一个大于零的数,如果前面字符小,则返回一个小于零的数,如果直到遇见“\0”一直大小相等,则返回0。

示例:

#include<stdio.h>
#include<string.h>

int main()
{
	char a[]="3g";
	char b[]="niubi";
	char c=strcmp(a,b);
	printf("%d",c);
return 0;
 } 

输出结果:

 然后我们来写mystrcmp()函数来实现strcmp的功能:

int mystrcmp(const char* str1, const char* str2) {
	int i = 0;
	while (str1[i] && str2[i]) {
		if (str1[i] == str2[i]) {
			i++;
		}
		else if (str1[i] > str2[i]) {
			return 1;
		}
		else {
			return -1;
		}
	}
	return 0;
}

 测试函数:

#include<stdio.h>
int mystrcmp(const char* str1, const char* str2) 
{
	int i = 0;
	while (str1[i] && str2[i]) {
		if (str1[i] == str2[i]) {
			i++;
		}
		else if (str1[i] > str2[i]) {
			return 1;
		}
		else {
			return -1;
		}
	}
	return 0;
}
int main()
{
	char a[]="3g";
	char b[]="niubi";
	char c=mystrcmp(a,b);
	printf("%d",c);
	return 0;
 } 

输出结果:

 4.strcpy()函数和strncpy()函数

用法:strcpy()函数把第二个字符串拷贝到第一个字符串

示例:

#include<stdio.h>
#include<string.h>
int main()
{
	char a[]="3g";
	char b[]="niubi";
	strcpy(a,b);
	printf("%s",a);
	return 0;
 } 

输出结果:

然后我们来写一个mystrcpy()函数来实现strcpy()的功能

char* mystrcpy(char* str1, const char* str2)
 {
	int i = 0;
	while (str2[i]) {
		str1[i] = str2[i];
		i++;
	}
	str1[i] = str2[i];
	return str1;
}

 测试函数:

#include<stdio.h>
 char* mystrcpy(char* str1, const char* str2) {
	int i = 0;
	while (str2[i]) {
		str1[i] = str2[i];
		i++;
	}
	str1[i] = str2[i];
	return str1;
}

int main()
{
	char a[]="3g";
	char b[]="niubi";
	mystrcpy(a,b);
	printf("%s",a);
	return 0;
 } 

测试结果

除此之外,字符串函数还有很多,比如:

strstr

char* strstr(const char* str1,const char* str2)
用法:检索子串在字符串中首次出现的位置,如果检索到子串就返回字符串str1中第一次出现子串str2的地址;如果没有检索到子串,则返回NULL。

strchr

char* strchr(const char* str,char c)

用法:查找字符串中第一次出现c的位置,如果s中存在c就返回首次出现c的位置的指针,如果s中不存在c则返回NULL。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值