字符函数与字符串函数

字符函数

1:字符分类函数

C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。
这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h

 

 2:字符转换函数

 c语言提供了两种字符转换函数

代码实现 

//判断小写字母,然后转换成大写
int main()
{
	char a[] = "abcdef\n";
	int b = 0;
	char c;
	while (a[b])
	{
		c = a[b];
		if (islower(c))
		{
			c = toupper(c);
		}
		putchar(c);//将字符标准输出
		b++;
	}
	return 0;
}

字符串函数

strlen的模拟实现
int  len(const char* str)
{
	assert(str);
	int a = 0;
	while (*str)
	{
		a++;
		str++;
	}
	return a;
}
int main()
{
	char a[] = "123456";
	int b=len(a);
	printf("%d", b);
	return 0;
}

这只是一种方式(计数器方式),还有另外两种方式,递归和指针-指针。

strcpy的模拟实现

str是将源空间的字符拷贝到目标空间中,以'\0'为结束标志。

  1. 源字符串必须以'\0'结束。
  2. 会将源字符串中的 '\0' 拷⻉到⽬标空间。
  3. ⽬标空间必须⾜够⼤,以确保能存放源字符串。
  4. ⽬标空间必须可变。

 模拟实现

char stcp(char* a, const char* b)
{
	char* c = a;
	assert(a);
	assert(b);
	while (*a++ = *b++)
	{
		;
	}
	return c;
}
int main()
{
	char  a[] = "abcdef";
    char  b[] = "xxx";
	stcp(a, b);
	printf("%s",a);
	return 0;
}
strcat模拟实现
  1. 源字符串必须以'\0' 结束。
  2. ⽬标字符串中也得有\0,否则没办法知道追加从哪⾥开始。
  3. ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
  4. ⽬标空间必须可修改。
  5.  字符串⾃⼰给⾃⼰追加,如何?

模拟实现

char stct(char* a, const char* b)
{
	assert(a);
	assert(b);
	char* p = a;
	char* i = b;
	int aa = 0;
	while (*a != '\0')
	{
		a++;
	}
	while (*b != '\0')
	{
		b++;
        aa++;
	}
	while (aa--)
	{
		*a++ = *i++;
	}
	return p;
}
int main()
{
	char a[20] = "abc";
	char* b = "def";
	stct(a, a);
	printf("%s", a);
	return 0;
}
strcmp 模拟实现
  1.  第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数 
  2. 第⼀个字符串等于第⼆个字符串,则返回0
  3. 第⼀个字符串等于第⼆个字符串,则返回0
  4. 那么如何判断两个字符串?⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩ 

 模拟实现

int my_strcmp(const char* a, const char* b)
{
	assert(a);
	assert(b);
	while (*a == *b)
	{
		if (*a == '\0')
			return 0;
		a++;
		b++;
	}
	return *a - *b;
}
int main()
{
	char a[] = "abc";
	char b[] = "abc";
	int c=my_strcmp(a, b);
	printf("%d", c);
	return 0;
}
strncpy模拟实现
  1. 拷⻉num个字符从源字符串到⽬标空间。
  2. 如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。

模拟实现

char* my_strncpy(char* a, const char* b, unsigned int c)
{
	char* d = a;
	assert(a);
	assert(b);
	while ((*a++ = *b++)&&c>0)
	{
			c--;
	}
	if (c > 0)
	{
		while (c--)
		{
			*a++ = '0';
		}
	}
	else
		*a = '\0';
	return d;
}
int main()
{
	char a[20] = "hello world";
	char b[20] = "world";
	my_strncpy(a, b, 8);
	printf("%s", a);
}
 strncat模拟实现

跟上面代码类似,模拟实现就是多了一个size_t参数,来表示追加几个字符。

模拟实现

char* my_strncat(char* a, const char* b, unsigned int c)
{
	char* d = a;
	assert(a);
	assert(b);
	while (*a)
	{
		a++;
	}
	while ( c > 0&& (*a++ = *b++))
	{
		c--;
	}
	if (c == 0)
	{
			*a++ = '\0';
	}
	return d;
}
int main()
{
	char a[20] = "abc";
	char b[] = "def";
	my_strncat(a, b, 2);
	printf("%s", a);
	return 0;
}
strncmp模拟实现
  1. ⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0。

模拟实现

int my_strncmp(const char* a, const char* b, size_t c)
{
	while (c-- && *a == *b)
	{
		a++;
		b++;
		if (c == 0)
			return 0;
	}
	return *a - *b;
}
int main()
{
	char a[] = "abcde";
	char b[] = "abced";
	int c=my_strncmp(a, b, 5);
	printf("%d", c);
	return 0;
}
 strstr模拟实现

在字符串中寻找子字符串,找到了就打印后续字符,直到‘\0’为止,没找到就返回空指针。

const char* my_strstr(const char* a, const char* b)
{
	const char* c = a;
	const char* d = b;
	while (*a)
	{
		c = a;
		d = b;
		while (*c == *d&&*c&&*d)
		{
			c++;
			d++;
		}
		if (*d == '\0')
		{
			return a;
		}
		a++;
	}
}
int main()
{
	char a[] = "abcdef";
	char b[] = "cd";
	char *c = my_strstr(a, b);
	if (c != NULL)
		printf("%s", c);
	else
		printf("找不到字符串");
	return 0;
}
strtok函数使用
  1. strtok作为字符串分隔符使用,找到分隔符并用‘\0’结尾
  2. strtok函数的第⼀个参数不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串中的位置。
  3. strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标记。
  4. 如果字符串中不存在更多的标记,则返回 NULL 指针。
int main()
{
	char a[] = "123456,4,6,789";
	char b[] = ",";
	char* c;
	for (c = strtok(a, b); c != NULL; c = strtok(NULL, b))
	{
       printf("%s\n", c);
	}

	return 0;
}
 strerror函数使用

strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。

这里我准备打开一个str.txt的文件,但是我的目录里面并没有,就会报出错误信息

“没有这样的文件或目录 ”

int main()
{
	char* b = fopen("str.txt", "r");
	//printf("%s\n", strerror(errno));
	perror("fopen");
	return 0;
}

perror也用是打印错误信息

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值