015-C语言字符函数和字符串函数
C语言字符函数和字符串函数
文章目录
- C语言字符函数和字符串函数
- 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
。
函数 | 如果参数满足下面条件就为真 |
---|---|
iscntrl | 任何字符 |
isspace | 空白字符:空格 ' ' 、换页 '\f' 、换行 '\n' 、回车 '\r' 、制表符 '\t' 、垂直制表符 '\v' |
isdigit | 十进制数字0~9 |
igxdigit | 十六进制数字1~9 、a~f 、A~f |
islower | 小写字母a~z |
isupper | 大写字母A~Z |
isalpha | 字母a~z 、A~Z |
isalnum | 字母或数字a~z 、A~Z 、0~9 |
ispunct | 标点符号,任何不属于字母或数字的可打印字符 |
isgraph | 任何图形字符 |
isprint | 任何可打印字符,包括图形字符和空白字符 |
使用这些函数的方法几乎都是一样的,只需要传入需要判断的字符,然后接受对应返回值即可。
2. 字符转换函数
C语言提供了2个字符转换函数。
使用这些函数需要包含头文件ctype.h
。
函数 | 作用 |
---|---|
tolower | 将传进去的小写字母转成大写 |
toupper | 将传进去的大写字母转成小写 |
3. strlen
size_t strlen(const char * str)
我们在之前就已经使用过很多次strlen
函数,这里做一下总结:
- 字符串以
'\0'
作为结束标志,strlen函数返回值是在字符串中'\0'
前面出现的个数。 - 参数指向的字符串必须要以
'\0'
结束。 - 注意函数的返回值为
size_t
,size_t
本质上是无符号整数。
#include <stdio.h>
#include <string.h>int main()
{const char* str = "hello world";printf("%d\n", strlen(str)); // 11return 0;
}
4. strcpy
char * strcpy(char * destination, const char * source);
-
函数参数:
destination
:目标字符串。source
:源字符串。- 源字符串的内容将会拷贝到目标字符串中。
-
源字符串必须以
'\0'
结束。 -
源字符串中的
'\0'
会被拷贝到目标字符串中。 -
目标字符串的空间必须足够大,保证能够放得下源字符串的内容
-
目标空间必须可变(非
const
)。 -
注意,在VS2022环境下无法直接使用
strcpy
,解决办法是加上#define _CRT_SECURE_NO_WARNINGS
。在后文有部分函数也会出现这个问题,看到这个警告后,按上述处理即可,后文将不再赘述此类问题。
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world";char str2[20];strcpy(str2, str1);printf("%s", str2);return 0;
}
5. strcat
char * strcat ( char * destination, const char * source );
-
函数参数:
- destination:目标字符串。
- source:源字符串。
- 源字符串中的内容将被追加到目标字符串。
-
源字符串必须以
'\0'
结束。 -
目标字符串也必须以
'\0'
结束。 -
目标空间必须足够大,保证能放得下追加后的内容。
-
目标空间必须可变。
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world";char str2[20] = "123456";strcat(str2, str1);printf("%s", str2);return 0;
}
6. strcmp
int strcmp ( const char * str1, const char * str2 );
-
函数参数
- 两个待比较的字符串。
- 比较规则,按照字典序比较:
- 从前往后比较两个字符串相同位置的字符。
- 当字符的ACSII码值小时,则该字符串更小,反之该字符串更大。
- 当字符相同时,比较下一个位置的字符。
- 当字符串1到末尾时,字符串2还未结束,那么字串1比字符串2小。
- 当两个字符串内容完全一致时,判定为相等。
-
第一个字符大于第二个字符串则返回大于0的数字。
-
两个字符串相等则返回0。
-
第二个字符串大于第一个字符串则返回小于0的数字。
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world123";const char* str2 = "hello world456";int tmp = strcmp(str2, str1);if (tmp > 0)printf("str2 > str1\n");else if (tmp == 0)printf("str2 == str1\n");elseprintf("str2 < str1\n");return 0;
}
7. strncpy
char * strncpy ( char * destination, const char * source, size_t num );
- 函数参数:
- 与strcpy不同的,num代表需要从源字符串拷贝的字符个数。
- 如果源字符串的长度小于num,则拷贝完源字符串后,在目标后面追加
\0
,直到num个。 - 需要注意的是,如果num小于source的长度,那么destination字符串的最后将不会有
\0
,打印时可能会造成越界访问。
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world";char* str2[20];char* str3[20];strncpy(str2, str1, 20);strncpy(str3, str1, 5);printf("%s\n", str2);printf("%s\n", str3);return 0;
}
上面打印的str3就出现了越界访问的问题。
8. strncat
char * strncat ( char * destination, const char * source, size_t num );
- 函数参数:
- 与strcat不同的,num代表需要从源字符串追加的字符个数。
- 如果源字符串长度小于num,则追加整个源字串。
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world";char str2[20] = "123";char str3[20] = "456";strncat(str2, str1, 20);strncat(str3, str1, 5);printf("%s\n", str2);printf("%s\n", str3);return 0;
}
9. strncmp
int strncmp ( const char * str1, const char * str2, size_t num );
- 函数参数
- 与strcmp不同的,num代表比较前num个字符数。
- 如果待比较的字符串长度比num小,则整个字符串参与比较。
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world123";const char* str2 = "hello world456";printf("%d\n", strncmp(str1, str2, 5));printf("%d\n", strncmp(str1, str2, 20));return 0;
}
10. strstr
const char * strstr ( const char * str1, const char * str2 );char * strstr ( char * str1, const char * str2 );
- 返回指向str1字符串中第一次出现str2字符串的指针。
- 如果str2不是str1的一部分,则返回NULL。
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "hello world";const char* str2 = "world";char* p = strstr(str1, str2);printf("%p\n%s\n", p, p);return 0;
}
11. strtok
char * strtok ( char * str, const char * delimiters );
-
函数参数:
- str:需要处理的目标字符串。
- delimiters:字符分隔符合集。
-
遍历str字符串,如果碰到delimiters中的字符,就将那个字符改成
\0
然后返回开始寻找的位置的指针。 -
如果传入str指针传入NULL,则strtok将从上一个被修改成
\0
的字符的后一个位置开始寻找。 -
如果没有找到,则返回NULL。
#include <stdio.h>
#include <string.h>int main()
{char str1[] = "192.168.0.0";char* p = strtok(str1, ".");while (p){printf("%s\n", p);p = strtok(NULL, ".");}return 0;
}
12. strerror
char * strerror ( int errnum );
-
函数参数:
- errnum:代表错误码,当程序异常退出时,会返回一个错误码。
-
将错误码传入strerror函数,就可以获取错误码对应的描述信息,判断出现了什么错误。
打印0~10号错误码对应的错误信息:
#include <stdio.h>
#include <string.h>int main()
{for (int i = 0; i <= 10; i++)printf("error code %d : %s\n", i, strerror(i));return 0;
}