C语言进阶之字符函数与字符串函数

今天我们来学习字符类型的函数

重点介绍处理字符和字符串的库函数的使用和注意事项

 求字符串长度 strlen

长度不受限制的字符串函数 strcpy strcat strcmp

长度受限制的字符串函数介绍 strncpy strncat strncmp

字符串查找 strstr strtok

错误信息报告 strerror

以上是我们今天要学习的函数,好,让我们开始逐一介绍

strlen

函数介绍

size_t strlen ( const char * str );

这个函数是用来计算字符串长度的,字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包 含 '\0' )。

上代码:

#include<stdio.h>
#include<string.h>
int main()
{
      char str[]="dtduyahgkjfjav";
      int len = strlen(str);
      printf("%d",len);
      return 0;
}

这样就算出来了。

现在大家来看这样一个代码

#include <stdio.h>
int main()
{
 const char*str1 = "abcdef";
 const char*str2 = "bbb";
 if(strlen(str2)-strlen(str1)>0)
 {
 printf(">\n");
 }
 else
 {
 printf("<\n");
 }
 return 0;
}
 

 仔细看这段代码。分别计算了两个字符串的长度,很明显,str1长于str2,所以这段代码的运行结果应该是<

答案揭晓:

 恰恰相反,这是为什么呢?

原因是strlen的返回值类型是size_t,这是无符号类型,自然都是正数了。

模拟实现

#include<stdio.h>

int my_strlen(char* str)

{

	int cnt = 0;

	while (*str != '\0')

	{
		str++;
		cnt++;
	}

	return cnt;

}

int main()

{

	char arr[] = "asdfghjkl";

	int len = my_strlen(arr);

	printf("%d ", len);

	return 0;

}

strcpy

char* strcpy ( char * destination , const char * source )

sgrcpy的用法是将一个字符串的字符复制到另一个字符串里。

直接上代码让大家直观感受:

#include<stdio.h>
#include<string.h>
int main()
{
    char arr1[20] = "sbdakdlnjfefe";
    char arr2[20] = "0";
    strcpy(arr2, arr1);//将arr1中的内容拷贝到arr2中
    printf("%s", arr2);

    return 0;
}

 注意事项:

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

模拟实现

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

int my_strlen(char* str)

{

int cnt = 0;

while (*str != '\0')

{

str++;

cnt++;

}

return cnt;

}

int main()

{

char arr[] = "asdfghjkl";

int len = my_strlen(arr);

printf("%d ", len);

return 0;

}

 strcat

char * strcat ( char * destination , const char * source );

 这个库函数实现的是给一个字符串追加上另一端字符串

上代码:

#include<stdio.h>
#include<string.h>
int main()
{
    char arr1[20] = "hello";
    char arr2[] = "world";
    strcat(arr1, arr2);
    printf("%s", arr1);

    return 0;
}

拼接成功,hello world

有一个问题,两个字符串的追加,一定是在末尾吗,编译器是怎么判断字符串的末尾的,其实,追加是往\0后边加。

看这个代码:

#include<stdio.h>
#include<string.h>
int main()
{
    char arr1[20] = "hello\0xxxxxxxxx";
    char arr2[] = "world";
    strcat(arr1, arr2);
    printf("%s", arr1);

    return 0;
}

 按照我们之前想的,world应该加到先后边,但是我们看输出面板

 依旧是helloworld,因为我们主动在world后边加了一个'\0',所以,可以得到,字符串的追加是从\0开始的.

注意事项:

1.源字符串必须以 '\0' 结束。
2.目标空间必须有足够的大,能容纳下源字符串的内容。
3.目标空间必须可修改。

模拟实现

#include<stdio.h>

#include<assert.h>

char* my_strcat(char* dest, char* src)

{

	char* ret = dest;

	assert(dest && src);

	while (*dest != '\0')

	{

		dest++;

	}

	while (*dest++ = *src++)

	{

		;

	}

	return ret;

}

int main()

{

	char arr1[20] = "dsfd";

	char arr2[20] = "ldmd";



	my_strcat(arr1, arr2);

	printf("%s\n", arr1);

	return 0;

}

 strcmp

int strcmp ( const char * p tr1 , const char * p tr2 );

 这个函数用来比较两个字符串的大小

标准规定:
第一个字符串大于第二个字符串,则返回大于 0 的数字
第一个字符串等于第二个字符串,则返回 0
第一个字符串小于第二个字符串,则返回小于 0 的数字
上代码:
#include<stdio.h>
#include<string.h>
int main()
{
    char arr1[20] = "efewgg";
    char arr2[] = "efwfe";
    int ret = strcmp(arr1, arr2);
    printf("%d", ret);

    return 0;
}

模拟实现

#include<stdio.h>

#include<assert.h>

int my_strcmp(char* dest, char* src)

{

	assert(dest && src);

	while (*dest=*src)

	{

		if (*dest == '\0')

		{

			return 0;

		}

		dest++;

		src++;

	}

	if (*dest < *src)

	{

		return -1;

	}

	else

	{

		return 1;

	}

}

int main()

{

	char arr1[20] = "dfghjkla";

	char arr2[20] = "asdfghjl";

	int ret = my_strcmp(arr1, arr2);

	printf("%d", ret);

	return 0;

}

 strncpy strncmp strncat

char * strncpy ( char * destination , const char * source , size_t num );

 这个函数和strcpy长得很像,其实功能也差不多,区别就是它是可控的

strcpy

strcmp

strcat

这三个函数,都是长度不受限制的字符串函数

现在我们要说的是长度受限制的字符串函数

strncpy

strncmp

strncat

有数字的限制

话不多说直接上代码

#include<stdio.h>
#include<string.h>
int main()
{
    char arr1[] = "efewgg";
    char arr2[5] = { 0 };
    strncpy(arr2, arr1, 3 );
    printf("%s", arr2);
    return 0;
}

 加了数字3的控制,只拷贝了3个字符

其他两个函数也是一样,大家举一反三就可以理解了。

strstr

char * strstr ( const char * str1 , const char * str2 );

 这个函数的作用是在字符串str1中找到字符串str2第一次出现的位置,如果没有,返回NULL

#include<stdio.h>
#include<string.h>
int main()
{
    char arr1[] = "abcdef";
    char arr2[5] = "bcd";
    char *p=strstr(arr1, arr2);
    if (p == NULL)
    {
        printf("找不到!\n");
    }
    else
    {
        printf("%s\n", p);
    }
    return 0;
}

 模拟实现

#include<stdio.h>

char* my_strstr(const char* str1, const char* str2)

{

	char* s1 = NULL;

	char* s2 = NULL;

	char* cp = (char*)str1;

	while (*cp)

	{

		s1 = cp;

		s2 = (char*)str2;

		while (*s1 && *s2 && *s1 == *s2)

		{

			s1++;

			s2++;

		}

		if (*s2 == '\0')

		{

			return cp;

		}

		cp++;

	}

	return NULL;

}

int main()

{

	char arr1[] = "abcdebcdf";

	char arr2[] = "bcd";

	char* p = my_strstr(arr1, arr2);

	if (p == NULL)

	{

		printf("找不到\n");

	}

	else

	{

		printf("%s\n", p);

	}

	return 0;

}

strcok

char * strtok ( char * str , const char * sep )

 这个函数的作用就是根据特殊符号分割字符串

1.sep 参数是个字符串,定义了用作分隔符的字符集合
2.第一个参数指定一个字符串,它包含了 0 个或者多个由 sep 字符串中一个或者多个分隔符分割的标
记。
3.strtok 函数找到 str 中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:
strtok 函数会改变被操作的字符串,所以在使用 strtok 函数切分的字符串一般都是临时拷贝的内容
并且可修改。)
4.strtok 函数的第一个参数不为 NULL ,函数将找到 str 中第一个标记, strtok 函数将保存它在字符串
中的位置。
5.strtok 函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标
记。
6.如果字符串中不存在更多的标记,则返回 NULL 指针。
话不多说直接上代码
#include<stdio.h>
#include<string.h>
int main()
{
    char arr[] = "lwenchao@yeah.net";
    char buf[30] = { 0 };//lwenchao@yeah.net
    strcpy(buf, arr);

    const char* p = "@.";
    char* str = strtok(buf, p);
    printf("%s\n", str);
    str = strtok(NULL, p);
    printf("%s\n", str);
    str = strtok(NULL, p);
    printf("%s\n", str);

    return 0;
}

 根据@和 . 将字符串分割成了三部分。

strerror

char * strerror ( int errnum );

返回错误码,所对应的错误信息。

 让我们上代码来测试一波

#include<stdio.h>
#include<string.h>
#include <errno.h>//必须包含的头文件
int main()
{
    char* p = strerror(0);
    printf("%s\n", p);
    p=strerror(1);
    printf("%s\n", p);
     p = strerror(2);
    printf("%s\n", p);
     p = strerror(3);
    printf("%s\n", p);

    return 0;
}

为什么会输出这些东西呢?

每一个错误码,都有一个错误信息,strerror函数就是告诉你错在了哪里

其实,C语言在调用函数的时候,如果调用失败,会把错误码存放在一个叫errno的变量中。

当我们想知道错在哪了时,就可以调用错误码翻译成错误信息

好的字符串函数就介绍完了,下棋借着东风接着讲述内存函数。

 

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

贰月磐石

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

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

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

打赏作者

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

抵扣说明:

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

余额充值