初学者关于字符函数和字符串函数的笔记(1)

发布于:2025-07-08 ⋅ 阅读:(19) ⋅ 点赞:(0)

 1字符分类函数

作用:字符分类

头文件:ctype.h

例子

int islower ( int c );

 这里参数为什么不是字符型而是整型?

2.字符转换函数

c语言中有两种

int tolower ( int c ); // 将参数传进去的⼤写字⺟转⼩写
int toupper ( int c ); // 将参数传进去的⼩写字⺟转⼤写

 字母大小写的转换虽然我们可以通过加减32来换算,现在我们有了函数,就可以直接用函数,方便。

# include <stdio.h>
# include <ctype.h>
int main ()
{
        int i = 0 ;
        char str[] = "Test String.\n" ;
        char c;
        while (str[i])
        {
                c = str[i];
                if ( islower (c))
                c = toupper (c);
                putchar (c);
                 i++;
        }
return 0 ;
}

3.strlen  <string.h>

 size_t strlen ( const char * str );

之前已经详细了解过,这里不再赘述,只强调一点

strlen的返回数值是无符号的整数,下列代码相减,数值上应该是-3,但是无符号整型没有符号位,-3的反码是11111111 11111111 11111101,是一个巨大的正整数,所以代码有问题 。

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

strlen函数的三种模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<assert.h>
#include<stdio.h>
//strlen的第三种实现形式
int my_strlen(const char* str)
{
	int count = 0;
	assert(str);
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}



int my_strlen(const char*str)
{
	assert(str);
	const char* p = str;
	while (*str)
	{
		str++;
	}
	return str - p;
}


int my_strlen(const char* str)
{
	assert(str);
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);
}
int main()
{

	const char* p = "abc";
	printf("%d", my_strlen(p));
	return 0;
}

4.strcpy  <string.h>

功能:拷贝字符串到\0为止。

char* strcpy(char * destination, const char * source );
返回目标空间起始地     目标空间地址            源空间地址

用法:

#include <stdio.h>
#include <string.h>
int main()
{
    char arr1[10] = {0};
    char arr2[] = "hello";
    strcpy(arr1, arr2);
    printf("%s\n", arr1);
    return 0;
}

注意:

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

模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<assert.h>
#include<stdio.h>
char* my_strcpy(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[100] = { '0'};
	char arr2[] = "hellow";
	printf("%s", my_strcpy(arr1, arr2));
	return 0;
}

5.stract

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\n", arr1);
    return 0;
}

注意:

源字符串必须以 '\0' 结束。
⽬标字符串中也得 \0 ,否则没办法知道追加从哪⾥开始。
⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
⽬标空间必须可修改

模拟实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include<assert.h>
#include<stdio.h>
char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while(*dest)
	{
		;
	}
	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[100] = "";
	char arr2[] = "hellow";
	printf("%s", my_strcat(arr1, arr2));  
	return 0;
}

6.strcmp

前边介绍过,不再赘述

7strncpy

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

和str相比多了个长度

功能:

按照指定长度copy源空间的字符覆盖到目标空间

用法:

#include <stdio.h>
#include <string.h>
int main()
{
    char arr1[20] = {0};
    char arr2[] = "abcdefghi";
    char* str = strncpy(arr1, arr2, 5);
    printf("%s\n", arr1);
    printf("%s\n", str);
    return 0;
}

注意:

strncpy 函数指定了拷⻉的⻓度,源字符串不⼀定要有 \0
源空间字符不够时用时,用 默认值来填充,来保证覆盖目标空间被覆盖指定长度

8.strncat

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

功能:

像目标空间添加指定长度的源空间字符串

同样源空间的字符串不再需要\0

用法:

#include <stdio.h>
#include <string.h>
int main()
{
    char arr1[20] = "hello ";
    char arr2[] = "world";
    char* str = strncat(arr1, arr2, 5);
    printf("%s\n", arr1);
    printf("%s\n", str);
    return 0;
}

9.strncmp

int strncmp ( const char * str1, const char * str2, size_t num );

功能:

字符串⽐较;⽐较 str1 str2 指向的两个字符串的内容,最多⽐较 num 字符。
返回值:

使用:

#include <stdio.h>
#include <string.h>
int main()
{
    char arr1[] = "abcdef";
    char arr2[] = "abcqw";
    int ret1 = strncmp(arr1, arr2, 3);
    printf("%d\n", ret1);
    int ret2 = strncmp(arr1, arr2, 4);
    printf("%d\n", ret2);
    return 0;
}

 


网站公告

今日签到

点亮在社区的每一天
去签到