C语言字符串

目录

简介

字符串输入输出

    字符串输入

字符串函数

字符串比较函数

模拟实现strcmp()函数

字符串复制函数

模拟实现strcpy()函数

 字符串连接函数

模拟实现strcat()函数

字符串长度函数

简介

字符串顾名思义,就是由连续的字符所组成,其定义一般为

char str[] = {"Hello"};

字符串输入输出

    字符串输入


如果想把一个字符串读取到程序中,必须首先预留存储字符串的空间,然后使用输入函数来获取这个字符串,我们有三种方法来读取字符串

1,scanf();
2,gets();
3,fgets();

创建存储空间

可以通过数组(char name[10])来分配存储空间,也可以通过动态分配内存函数来动态分配存储空间。

char *p;
scanf("%s", p);

如果通过上面的代码来创建存储空间,可能会通过编译器,但是在读入name的时候,name会覆盖程序中的数据和代码,并可能导致程序异常终止。这个是 因为scanf()把信息复制到由name指定的地址中,而在这种情况下,参数是个 未被初始化的指针,name可能指向任何地方。

gets()函数

gets()函数对于交互式程序非常方便,它从系统的标准输入设备(通常是键盘)获得一个字符串。    因为字符串没有预定的长度,所以gets()函数通过判断遇到的第一个换行符(\n)结束输入,按回车键可以产生这个字符。它读取换行符之前(不包括换行符)的所有字符,并在这些字符后添加一个空字符(\0)。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#define MAX 81

int main()
{
	char name[MAX];
	char *ptr; //指向char的指针

	printf("输入姓名:\n");
	ptr = gets(name); //使用一个地址吧字符串赋值给name
	//gets()函数使用return关键字返回字符串的地址
	printf("name, %s\n", name);
	printf("ptr, %s\n", ptr);
	system("pause");
	return 0;
}

如果在gets()函数在读取字符串时 出错或者遇到文件结尾,它就返回一个空(或0)地址,这个空地址被称为 空指针,并且stdio.h里面定义的常量 NULL来表示,可以用下面的代码来进行一些错误检测。

while(get(name) != NULL)

也可以通过 getchar()函数来完成上面的错误检测。

while((ch = getchar()) != EOF)

注意:空指针和空字符是不一样的,不要混淆。空指针是一个地址,而空字符是一个char类型的数据对象其值为0,数字上都可以用0表示,但是概念不同:NULL是一个指针,而0是一个char类型的常量。

字符串函数

字符串比较函数

int *strcmp(const char *str1,const char *str2)

我们可以直接调用strcmp()函数

int main()
{
	char str1[15]="hello";
	char str2[6] = "world";
	printf("%d\n",strcmp(str1,str2));
    system("pause");
	return 0;
}

如果相等返回true,否则返回false;

模拟实现strcmp()函数

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
int my_strcmp(const char *str1,const char *str2)
{
	assert(str1);
	assert(str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return 1;
}
int main()
{
	char arr[] = {"abcde"};
	char str[] = {"abcde"};//不相等的是"bcdef"
	//char tmp[20];
	int ret = my_strcmp(arr,str);
	if (ret == 0)
		printf("俩字符串相等\n");
	else
		printf("俩字符串不相等\n");
	system("pause");
	return 0;
}

字符串复制函数

char* strcpy(char *dest,const char* src)

int main(void)
{
	char str1[15];
	char str2[6] = "world";
	strcpy_s(str1, str2);//将str2字符数组复制到str1中,str1的容量必须比str2大
	printf("%s\n",str1);

	strncpy_s(str1, str2, 3);//将前3个字符复制到str1中
	puts(str1);
	return 0;
}

模拟实现strcpy()函数

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char * my_strcpy(char *dest,const char * src)
{
	char* p = dest;
	assert(dest!=NULL);
	assert(src!=NULL);
	while (*p++ = *src++)
	{
		;
	}
	return dest;
}
int main()
{
	char arr[] = {"xxxxx"};
	char str[] = {"abcde"};
	printf("变化前arr = %s\n", arr);
	my_strcpy(arr,str);
	printf("变化后arr = %s\n",arr);
	system("pause");
	return 0;
}

 字符串连接函数

char * strcat*(char* dest,const char* src)

模拟实现strcat()函数

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include <assert.h>
/*
char *strcat( char *strDestination, const char *strSource );
模拟实现strcat函数,字符串连接功能
*/
char* my_strcat(char* dest, const char* src)
{
	assert(dest && src); //确保指针有效性
	char* ret = dest;   //将目的地址保存起来,以便返回
	//1.找到目标空间的\0
	while (*dest)
	{
		dest++;
	}
	//2. 此时dest就是指向目标空间'\0'的位置
	while (*dest++ = *src++)
	{
		;//将源空间的字符串拷贝到目标空间中
		//源空间中的'\0'也拷贝过去了
	}
	return ret; //返回目标空间的地址
}
int main()
{
	char arr1[20] = "i love you";
	char arr2[] = "tonyStark";
	printf("%s\n", my_strcat(arr1, arr2));
	return 0;
}

字符串长度函数

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
/*strlen函数模拟实现
strlen() 函数是从字符串的开头位置依次向后计数,直到遇见\0,然后返回计时器的值*/
/*指针-指针法*/
/*int my_strlen(char* str)
{
	char* p = str;
	while (*p != '\0')
	{
		p++;
	}
	return p - str;
}
int main()
{
	char arr[] = { "abcdef" };
	int len = my_strlen(arr);
	printf("字符串长度为:%d",len);
	return 0;
}*/

/*计数器法*/
/*int my_strlen(char* str)
{
	int count = 0;;
	while (*str++)//找到\0退出
	{
		count++;
	}
	return count;
}
int main()
{
	char arr[] = { "abcdef" };
	int len = my_strlen(arr);
	printf("字符串长度为:%d", len);
	return 0;
}*/

/*递归法*/
int my_strlen(char* str)
{
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str+1);
}
int main()
{
	char arr[] = { "abcdef" };
	int len = my_strlen(arr);
	printf("字符串长度为:%d", len);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三桶老飞鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值