C语言 字符函数和字符串函数详解

本文详细介绍了C语言中一系列字符处理函数,如islower/isupper、tolower/toupper、strlen、strcpy、strcat、strcmp、strncpy、strncat、strncmp、strstr以及strtok和strerror的使用方法和注意事项。
摘要由CSDN通过智能技术生成

目录

1. 字符分类函数

2. 字符转换函数 

3. strlen

4. strcpy 

 5. strcat

6. strcmp

7. strncpy 函数的使⽤ 

8. strncat 函数的使⽤ 

9. strncmp函数的使⽤

10. strstr 

11. strtok函数的使⽤ 

12. strerror函数的使⽤


1. 字符分类函数

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

这些函数的使⽤⽅法⾮常类似,我们就讲解⼀个函数的事情,其他的⾮常类似:

int islower ( int c );

islower 是能够判断参数部分的c是否是⼩写字⺟的。 通过返回值来说明是否是⼩写字⺟,如果是⼩写字⺟就返回⾮0的整数,如果不是⼩写字⺟,则返回 0。

使⽤代码演⽰:写⼀个代码,讲字符串中的⼩写字⺟转⼤写,其他字符不变

#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 -= 32;
		putchar(c);
		i++;
	}
	return 0;
}

2. 字符转换函数 

C语⾔提供了2个字符转换函数:

上⾯的代码,我们将⼩写转⼤写,是-32完成的效果,有了转换函数,就可以直接使⽤ tolower 函 数。 

#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

 size_t strlen ( const char * str );

用于计算字符串的长度(即字符个数) 

函数接受一个参数 str,是要计算长度的字符串的指针。

strlen 函数会扫描 str 字符串,直到遇到字符串结束符 \0,然后返回字符串的长度,不包括结束符。

• 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包含 '\0' )

• 参数指向的字符串必须要以 '\0' 结束。

• 注意函数的返回值为size_t,是⽆符号的( 易错 )

#include <stdio.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;
}

4. strcpy 

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

用于将一个字符串复制到另一个字符串中

函数接受两个参数,destsrcdest 是目标字符串的指针,src 是源字符串的指针。

strcpy 函数会将 src 字符串的内容复制到 dest 字符串中,并返回 dest 字符串的指针。

• 源字符串必须以 '\0' 结束。

• 会将源字符串中的 '\0' 拷⻉到⽬标空间。

• ⽬标空间必须⾜够⼤,以确保能存放源字符串。

• ⽬标空间必须可变。 

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

int main() {
    char source[] = "Hello, World!";
    char destination[20];

    strcpy(destination, source);

    printf("Source: %s\n", source);
    printf("Destination: %s\n", destination);

    return 0;
}

以上代码中,我们声明了 sourcedestination 字符数组。使用 strcpy 函数将 source 中的字符串复制到 destination 中。最后,我们打印出复制前后的字符串内容。

输出结果:

Source: Hello, World!
Destination: Hello, World!

 5. strcat

char* strcat(char* dest, const char* src);

 用于将一个字符串追加到另一个字符串的末尾 

 函数接受两个参数,destsrcdest 是目标字符串的指针,src 是要追加的源字符串的指针。

strcat 函数会将 src 字符串的内容追加到 dest 字符串的末尾,并返回 dest 字符串的指针。

注意:dest 字符串必须有足够的空间来容纳新的追加内容。

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

int main() {
    char dest[20] = "Hello";
    char src[] = ", World!";

    strcat(dest, src);

    printf("Destination: %s\n", dest);

    return 0;
}

以上代码中,我们声明了 destsrc 字符数组。使用 strcat 函数将 src 字符串追加到 dest 字符串的末尾。最后,我们打印出追加后的字符串内容。

输出结果:

Destination: Hello, World!

6. strcmp

int strcmp(const char* str1, const char* str2);

用于比较两个字符串的大小关系 

 函数接受两个参数,str1str2,分别是要进行比较的两个字符串的指针。

strcmp 函数会按照字典顺序(ASCII码值的⼤⼩)比较两个字符串,并返回一个整数值来表示比较结果。返回值的含义如下:

  • 如果 str1 小于 str2,则返回一个负数(通常是 -1)。
  • 如果 str1 等于 str2,则返回 0。
  • 如果 str1 大于 str2,则返回一个正数(通常是 1)。
#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "apple";
    char str2[] = "banana";

    int result = strcmp(str1, str2);

    if (result < 0) {
        printf("%s is less than %s\n", str1, str2);
    } else if (result == 0) {
        printf("%s is equal to %s\n", str1, str2);
    } else {
        printf("%s is greater than %s\n", str1, str2);
    }

    return 0;
}

以上代码中,我们声明了 str1str2 字符数组。使用 strcmp 函数比较了这两个字符串的大小关系,并根据比较结果打印相应的消息。

输出结果:

apple is less than banana

7. strncpy 函数的使⽤ 

char* strncpy(char* dest, const char* src, size_t n);

用于将一个字符串的一部分复制到另一个字符串中

函数接受三个参数,destsrcndest 是目标字符串的指针,src 是源字符串的指针,n 是要复制的最大字符数。

strncpy 函数会将 src 字符串的最多前 n 个字符复制到 dest 字符串中。如果 src 的长度不足 n,则会在复制完 src 的内容后,用空字符 \0 填充 dest 字符串的剩余部分,以达到 n 个字符的长度。

注意:如果 src 的长度小于 n,则 dest 字符串可能不会以空字符结尾。

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

int main() {
    char dest[10];
    char src[] = "Hello, World!";

    strncpy(dest, src, 9);
    dest[9] = '\0';

    printf("Destination: %s\n", dest);

    return 0;
}

以上代码中,我们声明了 destsrc 字符数组。使用 strncpy 函数将 src 字符串的前 9 个字符复制到 dest 字符串中,并手动添加空字符 \0 来确保 dest 字符串以空字符结尾。最后,我们打印出复制后的字符串内容。

输出结果:

Destination: Hello, Wo

8. strncat 函数的使⽤ 

char* strncat(char* dest, const char* src, size_t n);

用于将一个字符串的一部分追加到另一个字符串的末尾 

函数接受三个参数,destsrcndest 是目标字符串的指针,src 是源字符串的指针,n 是要追加的最大字符数。

strncat 函数会将 src 字符串的最多前 n 个字符追加到 dest 字符串的末尾,并在追加完成后,用空字符 \0 结束 dest 字符串。

注意:如果 src 的长度小于 n,则 dest 字符串可能不会以空字符结尾。

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

int main() {
    char dest[20] = "Hello, ";
    char src[] = "World!";

    strncat(dest, src, 6);

    printf("Concatenated string: %s\n", dest);

    return 0;
}

以上代码中,我们声明了 destsrc 字符数组。使用 strncat 函数将 src 字符串的前 6 个字符追加到 dest 字符串的末尾。最后,我们打印出追加后的字符串内容。

输出结果:

Concatenated string: Hello, World

9. strncmp函数的使⽤

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

 用于比较两个字符串的前几个字符是否相等

函数接受三个参数,str1str2 分别是要进行比较的字符串的指针,n 是要比较的字符数。

strncmp 函数会比较 str1str2 字符串的前 n 个字符。如果两个字符串在前 n 个字符上完全相同,则返回值为 0。如果两个字符串不相同,则返回值为它们在第一个不同字符处的 ASCII 码差值。如果 n 大于两个字符串的长度,或者两个字符串在前 n 个字符上完全相同但长度不相等,则返回值为它们的长度差值。

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

int main() {
    const char* str1 = "Hello";
    const char* str2 = "Help";
    int result = strncmp(str1, str2, 3);

    if (result == 0) {
        printf("The first 3 characters are the same.\n");
    } else if (result < 0) {
        printf("The first 3 characters of str1 are smaller.\n");
    } else {
        printf("The first 3 characters of str1 are greater.\n");
    }

    return 0;
}

以上代码中,我们声明了 str1str2 字符串指针。使用 strncmp 函数比较 str1str2 字符串的前 3 个字符,并根据返回结果打印相应的消息。

输出结果:

The first 3 characters are the same.

10. strstr 

char* strstr(const char* haystack, const char* needle);

用于在一个字符串中查找另一个子字符串的第一次出现位置 

函数接受两个参数,haystackneedle,分别是要被搜索的字符串和要搜索的子字符串。

strstr 函数会在 haystack 字符串中查找第一次出现的 needle 子字符串,并返回一个指向该位置的指针。如果找到了子字符串,返回的指针指向 haystack 中匹配的子字符串的第一个字符;如果未找到子字符串,则返回空指针。

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

int main() {
    const char* haystack = "Hello, World!";
    const char* needle = "World";

    char* result = strstr(haystack, needle);

    if (result != NULL) {
        printf("Found at index: %ld\n", result - haystack);
    } else {
        printf("Not found\n");
    }

    return 0;
}

以上代码中,我们声明了 haystackneedle 字符串指针。使用 strstr 函数在 haystack 字符串中查找第一次出现的 needle 子字符串,并根据返回结果打印相应的消息。

输出结果:

Found at index: 7

11. strtok函数的使⽤ 

char* strtok(char* str, const char* delim);

用于将一个字符串按照指定的分隔符进行分割,并返回分割后的子字符串 

函数接受两个参数,str 是要被分割的字符串的指针,delim 是分隔符字符串的指针。在第一次调用 strtok 函数时,需要将要被分割的字符串作为参数传入函数。在后续的调用中,只需要传入空指针即可继续分割原字符串。

strtok 函数会将被分割的字符串按照 delim 中的字符作为分隔符进行分割,并返回第一个子字符串的指针。在后续的调用中,函数会继续返回下一个子字符串的指针,直到全部分割完成。

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

int main() {
    char str[] = "Hello,World!How are you?";
    char* token;

    token = strtok(str, ",! ");
    while (token != NULL) {
        printf("%s\n", token);
        token = strtok(NULL, ",! ");
    }

    return 0;
}

以上代码中,我们声明了一个 str 字符数组,并使用 strtok 函数将其按照逗号、感叹号和空格进行分割。通过一个循环遍历所有分割后的子字符串,并将其打印出来。

输出结果:

Hello
World
How
are
you?

12. strerror函数的使⽤

char* strerror(int errnum);

用于根据给定的错误码返回对应的错误描述字符串 

函数接受一个整数参数 errnum,表示错误码。它会根据给定的错误码返回对应的错误描述字符串。

strerror 函数会查找系统定义的错误码表,并返回与 errnum 相对应的错误描述字符串。如果无法找到对应的错误描述,那么函数将返回一个通用的错误信息字符串。

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

int main() {
    int errnum = EACCES;
    char* errmsg = strerror(errnum);

    printf("Error message for errno %d: %s\n", errnum, errmsg);

    return 0;
}

以上代码中,我们使用 strerror 函数获取 EACCES 错误码(表示权限被拒绝)对应的错误描述字符串,并将其打印出来。

输出结果:

Error message for errno 13: Permission denied

需要注意的是,strerror 函数是线程不安全的,因为它使用了一个静态的字符串缓冲区来存储错误描述。如果在多线程环境下使用,可能会导致数据竞争和不可预测的结果。为了避免这个问题,可以使用 strerror_r 函数,它是一个线程安全的版本。 

                                                希望我的文章能对你有所帮助,感谢支持!!! 

 

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

饿了我会自己捡代码吃

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

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

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

打赏作者

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

抵扣说明:

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

余额充值