字符串与相应函数(上)

发布于:2025-04-13 ⋅ 阅读:(26) ⋅ 点赞:(0)

字符串处理函数分类

  • 求字符串长度:strlen
  • 长度不受限制的字符串函数:strcpy,strcat,strcmp
  • 长度受限制的字符串函数:strncpy,strncat,strncmp
  • 字符串查找:strstr,strtok
  • 错误信息报告:strerror
  • 字符操作,内存操作函数:memcpy,memmove,memset,memcmp

strlen

这是一个用于计算字符串长度的函数,它从字符串的起始位置开始计数,直到遇到字符串结束符\0为止,然后返回计数器的值。这个函数不包括结束符\0在内

strlen函数的特点

  • 字符串以‘\0’作为结束标志,strlen函数返回的是字符串中‘\0’前面出现的字符个数

strlen函数的模拟实现

 #define  _CRT_SECURE_NO_WARNINGS 1

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

int my_strlen1(const char* str)
{
	assert(str != NULL);
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}

//递归
int my_strlen2(const char* str)
{
	assert(str != NULL);
	if (*str != '\0')
		return 1 + my_strlen2(str + 1);
	else
		return 0;
}

//指针-指针
int my_strlen3(const char* str)
{
	const char* start = str;
	while (*str)
	{
		str++;
	}
	return str - start;
}

int main()
{
	char arr[] = "abcdef";
	int ret1 = my_strlen1(arr);
	int ret2 = my_strlen2(arr);
	int ret3 = my_strlen3(arr);
	printf("%d\n", ret1);
	printf("%d\n", ret2);
	printf("%d\n", ret3);
	return 0;
}

strlen函数的使用

#define  _CRT_SECURE_NO_WARNINGS 1

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

int main()
{
	char arr[] = "bdeuwbfuycgbei";
	int ret = strlen(arr);
	printf("%d", ret);
	return 0;
}

输出结果:

strcpy

这个函数用于将一个字符串复制到另一个字符串中,直到遇到源字符串的结束符\0为止。如果目标字符串已经有内容,会被源字符串覆盖

strcpy函数的特点

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

strcpy函数的模拟实现

#define  _CRT_SECURE_NO_WARNINGS 1

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

char* my_strcpy(char* din, char* sou)
{
	char* ret = din;
	assert(din && sou);
	while ( *din++=*sou++ )
	{
		;
	}
	return ret;
}

int main()
{
	char str1[20] = "hello ";
	char str2[] = "hehe";
	my_strcpy(str2, str1);
	printf("%s\n", str2);
	return 0;
}

输出结果

strcpy函数的使用

#define  _CRT_SECURE_NO_WARNINGS 1

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

int main()
{
	char arr1[] = "hello";
	char arr2[] = "xixi";
	strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

strcat

这个函数用于将一个字符串追加到另一个字符串的末尾,形成一个新的字符串。它会将源字符串的内容添加到目标字符串的后面,直到遇到源字符串的结束符\0为止

strcat函数的特点

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

strcat函数的模拟实现

#define  _CRT_SECURE_NO_WARNINGS 1

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

char* my_strcat(char* din, char* sou)
{
	assert(din && sou);
	char* ret = din;
	while (*din)
	{
		din++;
	}

	while (*din++ = *sou++)
	{
		;
	}
	return ret;
}

int main()
{
	char arr1[] = "hello ";
	char arr2[] = "world";
	my_strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

strcat函数的使用

#define  _CRT_SECURE_NO_WARNINGS 1

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

int main ()
{
  char key[] = "apple";
  char buffer[80];
  do {
     printf ("Guess my favorite fruit? ");
     fflush (stdout);
     scanf ("%79s",buffer);
  } while (strcmp (key,buffer) != 0);
  puts ("Correct answer!");
  return 0;
}

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

int main()
{
	char str[80];
	strcpy(str, "these ");
	strcat(str, "strings ");
	strcat(str, "are ");
	strcat(str, "concatenated.");
	puts(str);
	return 0;
}

输出结果:

strcmp

这个函数用于比较两个字符串。如果两个字符串相等,它返回0;如果第一个字符串小于第二个字符串,它返回负数;如果第一个字符串大于第二个字符串,它返回正数

strcmp函数的规定

strcmp函数的模拟实现

#define  _CRT_SECURE_NO_WARNINGS 1

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

int my_strcmp(const char* arr1, const char* arr2)
{
	assert(arr1 && arr2);
	while (*arr1 == *arr2)
	{
		if (*arr1 == '\0')
			return 0;
		*arr1++;
		*arr2++;
	}
	return *arr1 - *arr2;
}

int main()
{
	char arr1[] = "abc";
	char arr2[] = "abcde";
	int ret = my_strcmp(arr1, arr2);
	printf("%d\n", ret);
	return 0;
}

strcmp函数的使用

#define  _CRT_SECURE_NO_WARNINGS 1

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

int main()
{
    char key[] = "apple";
    char buffer[80];
    do {
        printf("Guess my favorite fruit? ");
        fflush(stdout);
        scanf("%79s", buffer);
    } while (strcmp(key, buffer) != 0);
    puts("Correct answer!");
    return 0;
}

输出结果:

strcpy,strcat,strcmp与strncpy,strncat,strncmp的区别

长度限制方面

  • strcpystrcatstrcmp:属于长度不受限制的字符串函数,以 '\0' 作为操作结束标志。例如 strcpy 会将源字符串一直拷贝到 '\0' 才停止,strcat 会将源字符串追加到目标字符串后直到源字符串的 '\0'strcmp 会比较两个字符串直到遇到 '\0'。不过这也可能带来问题,如 strcpy 在目的空间不够时,由于拷贝到 '\0' 才停止,可能会导致越界访问,使函数变得不安全
  • strncpystrncatstrncmp:属于长度受限制的字符串函数,在函数调用时需要额外指定操作的字符数量,能避免因操作过长字符串而引发的安全问题
     

#define  _CRT_SECURE_NO_WARNINGS 1
/* strncpy example */
#include <stdio.h>
#include <string.h>

int main()
{
	char str1[] = "To be or not to be";
	char str2[40];
	char str3[40];

	/* copy to sized buffer (overflow safe): */
	strncpy(str2, str1, sizeof(str2));

	/* partial copy (only 5 chars): */
	strncpy(str3, str2, 5);
	str3[5] = '\0';   /* null character manually added */

	puts(str1);
	puts(str2);
	puts(str3);

	return 0;
}

输出结果:

其他两个相似