C语言:五、字符串

1. 字符的定义方式及输出

#include<stdio.h>

int main() 
{
	//1.定义字符串的第一种方式:以个的形式(参考数组)
	char str1[5] = {'a','b','c','d','e'};//char型数组
	for (int i = 0;i < sizeof(str1) / sizeof(str1[0]);i++)
		printf("%c", str1[i]);
	putchar('\n');

	//2.定义字符串的第二种方式:以串的形式(有定义字符串长度)
	char str2[5] = {"abcde" };
	for (int i = 0;i < sizeof(str2) / sizeof(str2[0]);i++)
		printf("%c", str2[i]);
	putchar('\n');

	//3.定义字符串的第三种方式:以串的形式(没有定义字符串长度)
	char str3[] = { "abcde" };//根据输入自动分配长度
	for (int i = 0;i < sizeof(str3) / sizeof(str3[0]);i++)
		printf("%c", str3[i]);
	putchar('\n');

	//4.定义字符串的第四种方式:利用指针
	char* pstr = "hello world";//与数组赋值给指针变量对比
	printf("%s\n",pstr);
}

在这里插入图片描述

2. 字符串在内存中的存储方式

#include<stdio.h>

int main()
{
	int a[3] = { 1,2.3 };
	printf("整型数组的大小:%d\n",sizeof(a));
	printf("整型数组元素的大小:%d\n", sizeof(a[0]));
	printf("整型数组类型的大小:%d\n", sizeof(int));
	printf("整型数组元素个数:%d\n", sizeof(a) / sizeof(a[0]));

	char str[] = "abc";//包括了'\0',字符串结束标志
	printf("字符数组的大小:%d\n", sizeof(str));
	printf("字符数组元素的大小:%d\n", sizeof(str[0]));
	printf("字符数组类型的大小:%d\n", sizeof(char));
	printf("字符数组元素个数:%d\n", sizeof(str) / sizeof(str[0]));
	
	str[3] = a;//另结束标志'\0'改为a,结果将得到一个乱码
	printf("该元素的大小:%d\n", str[3]);
}

在这里插入图片描述

3.sizeof和strlen在字符串计算中的区别

#include<stdio.h>

int main()
{
	//我们用strlen来获取字符串有效长度
	char str[128] = "abc";
	printf("该字符数组元素个数:%d\n", sizeof(str) / sizeof(str[0]));
	printf("有效元素个数:%d\n", strlen(str));
}

在这里插入图片描述

4.字符串操作常用函数

	API(Application Programming Interface,应用程序接口)(函数接口)
	几种常用api:
	1.输出字符串:puts();   printf("%s",p);
	2.获取字符串:gets    scanf("%s",p);
	3.计算长度:strlen
	4.初始化:memset
	5.拷贝:strcpy   strncpy
	6.拼接:strcat
	7.比较:strcmp
	8.查找:strchr
	9.字符串分割:strstr  strtok
	10.转为小写的函数:strlwr
	11.转为大写的函数:strupr

**加粗样式**

#include<stdio.h>

int main()
{
//puts其调用方式为,puts(s);其中s为字符串字符(字符串数组名或字符串指针)。

	/*
	char* pstr;//此处pstr为野指针,没有初始化,不知道指向什么地方
	printf("请输入字符串:");
	scanf_s("%s",pstr);//无法通过键盘给pstr传递字符串,参考之前的输入数组长度
	puts(pstr);
	*/
	char* pstr;//此处pstr仍为野指针

	pstr = (char*)malloc(128);//1.申请了空间|一旦使用malloc一定要注意内存泄漏的问题,要对返回值进行判断
	if (pstr == NULL)
		printf("申请内存失败");//一旦使用malloc一定要注意内存泄漏的问题,要对返回值进行判断

	memset(pstr,'\0',128);//2.全部初始化为'\0'
	//初始化函数memset(),有三个参数:初始化的对象,初始化成什么字符,初始化多少(多大)

	printf("请输入字符串:");
	gets(pstr);
	puts(pstr);//puts自带换行

}

5.字符串操作常用函数二

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

int main()
{
	//拷贝:strcpy
	//C 库函数 char* strcpy(char* dest, const char* src) 把 src 所指向的字符串复制到 dest。
	//dest -- 指向用于存储复制内容的目标数组。
	//src -- 要复制的字符串。

	char* strdest;
	strdest = (char*)malloc(128);
	memset(strdest,'0',128);
	char* strsrc = "hello world";
	strcpy(strdest,strsrc);
	puts(strdest);

	//拼接:strcat
	//在C中,函数原型存在 <string.h>头文件中。
	//声明:char *strcat(char *dest, const char *src)
	//dest -- (被追加的)指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串。
	//src -- (要加的东西)指向要追加的字符串,该字符串不会覆盖目标字符串。
	char* add = "!!!";
	strcat(strdest,add);

	//比较:strcmp
	//声明:int strcmp(const char *str1, const char *str2)
	//str1 -- 要进行比较的第一个字符串;str2 -- 要进行比较的第二个字符串。
	//如果返回值小于 0,则表示 str1 小于 str2。
	//如果返回值大于 0,则表示 str1 大于 str2。
	//如果返回值等于 0,则表示 str1 等于 str2。

	char* str1 = "90";
	char* str2 = "100";
	int ret;
	ret= strcmp(str1,str2);
	switch (ret) {
		case 0:printf("str1=str2");break;
		case 1:printf("str1>str2");break;
		case -1:printf("str1<str2");break;
	}
	

}

6.字符串操作常用函数三

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

int main()
{
	//查找:strchr
	//strchr函数功能为在一个串中查找给定字符的第一个匹配之处。
	//函数原型为:char *strchr(const char *str, int c)
	//即在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。
	//strchr函数包含在C 标准库 <string.h>中。

	char* str = "shuaige";//有一个名为帅哥的字符串
	char c = 'i';//我要在字符串里找一个a字
	char* p = NULL;//把P初始化,用来接收搜索的结果
	p=strchr(str,c);//(被搜索的字符串,搜索的关键字)
	
	if (p == NULL)
		printf("没有搜索到你要的位置");
	else {
		printf("搜索位置为:");
		puts(p);
	}
	
	//查找字符串:strstr
	//C 标准库 - <string.h>,声明char *strstr(const char *haystack, const char *needle) 
	//参数:haystack -- 要被检索的 C 字符串。
	//参数:needle -- 在 haystack 字符串内要搜索的小字符串。
	//在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。
	char* substr = "ai";//ai及后面的内容都打印出来了
	p = strstr(str,substr);
	if (p == NULL)
		printf("没有搜索到你要的位置");
	else {
		printf("搜索位置为:");
		puts(p);
	}

	/*char str1[] = "hello world";
	char* q = _strupr_s(str1,12);
	puts(q);
	puts(strlwr(strupr(p)));不知道为什么出错了*/

	//字符串分割:strtok—头文件: #include <string. h>
	//函数原型: char *strtok(char* str,const char* delimiters);
	//参数: str: 待分割的字符串(c-string) ; delimiters: 分割符字符串。
	/*char* str2 = "ni,hao,zhe,ge,shi,jie";
	char* p2 = strtok(str2,",");
	if (p2 == NULL) {
		printf("无法分割");
	}
	else puts(p2);
	puts(strtok(NULL,","));//获取下一个串的方式比较奇葩,目标字符串改为NULL
	*/

}

7.自己实现字符串操作api

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

void myputs(const char*p) {
	while (*p!='0')
	{
		putchar(*p++);
	}
}

int main()
{
	
	const char* p = "hello world";
	myputs(p);
}

8.自己实现字符串操作api二

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

void mycopy(char*dest,const char*src)
{
	if (dest == NULL || src == NULL) 	
    {
		return NULL;
	}

	while (*src != '0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	return dest;
}

int main()
{
	char* dest = {'0'};
	char* src = "qwer";
	mycopy(dest,src);
	puts(dest);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值