上一篇:数组和指针
下一篇:文件操作
❤️🔥前情提要❤️🔥
欢迎来到C语言基本语法教程
在本专栏结束后会将所有内容整理成思维导图(结束换链接)并免费提供给大家学习,希望大家纠错指正。本专栏将以基础出发,在之后的教程中将会不断学习并详细讲解C语言的基本语法
及其高级用法
。
上一节讲了C语言基础中的数组和指针,接下来让我们来一起学习C语言中的字符串和字符处理
。
🍪本教程内容干货满满,跟上步伐吧~🍪
作者介绍:
🎓 作者:某不知名编程爱好者📜
🗒️系列文章&专栏推荐: 🔗《华为机试题解析》 、🔗《C语言程序设计》、🔗 《MySQL数据库》
🕸️为大家推荐一款很好用的C语言刷题网站🔗点击跳转
🔖导航小助手🔖
- 📑 字符串和字符处理
- 📑 1. 字符串和字符处理基础
- 📑 2. C语言中的字符串操作函数
- 🏷️ 2.1 strlen()函数——获取字符串长度
- 🏷️ 2.2 strcpy()函数——复制字符串
- 🏷️ 2.3 strcat()函数——连接字符串
- 🏷️ 2.4 strcmp()函数——比较字符串
- 📑 3. C语言中的字符操作函数
- 🏷️ 3.1 isalpha()函数——判断字符是否为字母
- 🏷️ 3.2 isdigit()函数——判断字符是否为数字
- 🏷️ 3.3 toupper()函数——将小写字母转换成大写字母
- 🏷️ 3.4 tolower()函数——将大写字母转换成小写字母
- 📑 4. 字符串高级操作
- 🏷️ 4.1 正则表达式——用于字符串匹配和替换
- 🏷️ 4.2 命令行参数——用于字符串传递和处理
- 🏷️ 4.3 字符串的动态分配——用于灵活地管理字符串存储空间
- 📑 5. 实用例程和技巧
- 🏷️ 5.1 实现字符串反转
- 🏷️ 5.2 实现字符串的查找和替换
- 🏷️ 5.3 实现字符串的解码和编码
- 🏷️ 5.4 实现字符串的加密和解密
- ⚠️ 注意事项
- 🎀小结
📑 字符串和字符处理
- C语言是一门广泛应用于
系统编程
和嵌入式设备
的编程语言。在C语言的编程过程中,字符串和字符处理
是一个非常重要
的部分。本文将介绍C语言中的字符串和字符处理,包括基础概念
、常用函数
、高级操作
以及实用技巧等方面。
📑 1. 字符串和字符处理基础
字符
是用单引号
括起来的一个字符,字符串
则是用双引号
括起来的一串字符。例如:
char ch = 'A';
char str[] = "Hello world!";
- 字符串的
结束标志
是一个空字符'\0'
,即ASCII码为0
的字符。所以在定义字符串时要留出一个字符用于存放空字符
。例如:
char str1[] = "abc";
char str2[] = {'a', 'b', 'c', '\0'};
- 使用
%s
来输出字符串
,使用%c
来输出单个字符
。例如:
printf("str1: %s\n", str1);
printf("ch: %c\n", ch);
📑 2. C语言中的字符串操作函数
🏷️ 2.1 strlen()函数——获取字符串长度
strlen()
函数可以用于获取字符串的长度
,即字符串中字符的个数。它的原型为:
size_t strlen(const char *str);
- str表示输入的字符串,函数返回字符串的长度,
不包括空字符
。例如:
char str[] = "abc";
size_t len = strlen(str);
printf("str长度:%d\n", len);
输出结果为:
str长度:3
🏷️ 2.2 strcpy()函数——复制字符串
strcpy()
函数用于将一个字符串复制到另一个字符串
里。它的原型为:
char *strcpy(char *dest, const char *src);
- dest表示目标字符串,src表示源字符串。函数返回指向目标字符串的指针。例如:
char str1[] = "abc";
char str2[10];
strcpy(str2, str1);
printf("str2: %s\n", str2);
输出结果为:
str2: abc
🏷️ 2.3 strcat()函数——连接字符串
strcat()
函数用于将两个字符串连接起来
,即把源字符串连接到目标字符串的末尾。它的原型为:
char *strcat(char *dest, const char *src);
- dest表示目标字符串,src表示源字符串。函数返回指向目标字符串的指针。例如:
char str1[10] = "abc";
char str2[] = "def";
strcat(str1, str2);
printf("str1: %s\n", str1);
输出结果为:
str1: abcdef
🏷️ 2.4 strcmp()函数——比较字符串
strcmp()
函数用于比较两个字符串的大小
,它的原型为:
int strcmp(const char *str1, const char *str2);
- str1和str2为要比较的两个字符串,函数返回值为0表示两个字符串相等,返回值大于0表示str1大于str2,返回值小于0表示str1小于str2。例如:
char str1[] = "abc";
char str2[] = "def";
int res = strcmp(str1, str2);
if (res > 0) {
printf("str1大于str2\n");
} else if (res == 0) {
printf("str1等于str2\n");
} else {
printf("str1小于str2\n");
}
输出结果为:
str1小于str2
📑 3. C语言中的字符操作函数
除了字符串操作函数外,C语言还提供了一些常用的字符操作函数
,下面列举一些常用的字符操作函数。
🏷️ 3.1 isalpha()函数——判断字符是否为字母
isalpha()
函数可以用于判断一个字符是否为字母
,它的原型为:
int isalpha(int c);
- c为要判断的字符,函数返回值为非零表示是字母,返回0表示不是字母。例如:
char ch1 = 'a';
char ch2 = '1';
if (isalpha(ch1)) {
printf("%c是字母\n", ch1);
} else {
printf("%c不是字母\n", ch1);
}
if (isalpha(ch2)) {
printf("%c是字母\n", ch2);
} else {
printf("%c不是字母\n", ch2);
}
输出结果为:
a是字母
1不是字母
🏷️ 3.2 isdigit()函数——判断字符是否为数字
isdigit()
函数可以用于判断一个字符是否为数字
,它的原型为:
int isdigit(int c);
- c为要判断的字符,函数返回值为非零表示是数字,返回0表示不是数字。例如:
char ch1 = '1';
char ch2 = 'a';
if (isdigit(ch1)) {
printf("%c是数字\n", ch1);
} else {
printf("%c不是数字\n", ch1);
}
if (isdigit(ch2)) {
printf("%c是数字\n", ch2);
} else {
printf("%c不是数字\n", ch2);
}
输出结果为:
1是数字
a不是数字
🏷️ 3.3 toupper()函数——将小写字母转换成大写字母
toupper()
函数可以用于将小写字母转换成大写字母
,它的原型为:
int toupper(int c);
- c为要转换的字符,函数返回值为转换后的字符。例如:
char ch = 'a';
ch = toupper(ch);
printf("ch: %c\n", ch);
输出结果为:
ch: A
🏷️ 3.4 tolower()函数——将大写字母转换成小写字母
tolower()
函数可以用于将大写字母转换成小写字母
,它的原型为:
int tolower(int c);
- c为要转换的字符,函数返回值为转换后的字符。例如:
char ch = 'A';
ch = tolower(ch);
printf("ch: %c\n", ch);
输出结果为:
ch: a
📑 4. 字符串高级操作
除了基础的字符串操作外,C语言还提供了一些高级的字符串操作技巧
。
🏷️ 4.1 正则表达式——用于字符串匹配和替换
正则表达式
是一种专门用来描述字符串的模式的语言
。在C语言中,可以使用正则表达式库regex.h
来进行字符串匹配
和替换
等操作。下面是一个例子:
#include <stdio.h>
#include <regex.h>
int main()
{
regex_t reg;
char *pattern = "a(.*)e";
char *str = "apple orange";
regmatch_t pmatch[10];
int ret, i;
ret = regcomp(®, pattern, REG_EXTENDED|REG_NEWLINE);
if (ret != 0) {
printf("compile failed\n");
return -1;
}
ret = regexec(®, str, 10, pmatch, 0);
if (ret != 0) {
printf("match failed\n");
return -1;
}
for (i = 0; i < 10 && pmatch[i].rm_so != -1; i++) {
printf("match: %.*s\n", pmatch[i].rm_eo - pmatch[i].rm_so, str + pmatch[i].rm_so);
}
regfree(®);
return 0;
}
输出结果为:
match: apple
🏷️ 4.2 命令行参数——用于字符串传递和处理
- 在C语言中,可以通过命令行参数来传递字符串。例如,下面的代码将命令行参数中的字符串拼接起来输出:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int i;
char str[100] = "";
for (i = 1; i < argc; i++) {
strcat(str, argv[i]);
}
printf("str: %s\n", str);
return 0;
}
在命令行中输入:
./a.out abc def ghi
输出结果为:
str: abcdefghi
🏷️ 4.3 字符串的动态分配——用于灵活地管理字符串存储空间
在C语言中,可以使用动态分配内存
的方式来分配字符串的存储空间
,并在程序运行期间灵活地管理。下面是一个例子:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *str = (char *)malloc(sizeof(char) * 10);
strcpy(str, "oldstr");
printf("str: %s\n", str);
str = (char *)realloc(str, sizeof(char) * 20);
strcat(str, "newstr");
printf("str: %s\n", str);
free(str);
return 0;
}
输出结果为:
str: oldstr
str: oldstrnewstr
📑 5. 实用例程和技巧
在实际编程中,常常需要对字符串进行各种操作
,以下是一些常用的例程和技巧。
🏷️ 5.1 实现字符串反转
#include <stdio.h>
#include <string.h>
void reverse(char *str)
{
int i, j;
char temp;
for (i = 0, j = strlen(str) - 1; i < j; i++, j--) {
temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}
int main()
{
char str[] = "abcdefg";
printf("before: %s\n", str);
reverse(str);
printf("after: %s\n", str);
return 0;
}
输出结果为:
before: abcdefg
after: gfedcba
🏷️ 5.2 实现字符串的查找和替换
#include <stdio.h>
#include <string.h>
void replace(char *str, char *search, char *replace)
{
char *pos, temp[100];
int len1, len2;
len1 = strlen(search);
len2 = strlen(replace);
pos = strstr(str, search);
while (pos != NULL) {
memcpy(temp, str, pos - str);
temp[pos - str] = '\0';
strcat(temp, replace);
strcat(temp, pos + len1);
strcpy(str, temp);
pos = strstr(str, search);
}
}
int main()
{
char str[] = "this is a test";
printf("before: %s\n", str);
replace(str, "is", "was");
printf("after: %s\n", str);
return 0;
}
输出结果为:
before: this is a test
after: thwas was a test
🏷️ 5.3 实现字符串的解码和编码
在网络通信
中,常常需要进行字符串的编码
和解码
,以下是一个例子:
#include <stdio.h>
#include <string.h>
void encode(char *str)
{
int i;
for (i = 0; i < strlen(str); i++) {
str[i] = str[i] + 5;
}
}
void decode(char *str)
{
int i;
for (i = 0; i < strlen(str); i++) {
str[i] = str[i] - 5;
}
}
int main()
{
char str[] = "hello world";
printf("before: %s\n", str);
encode(str);
printf("encoded: %s\n", str);
decode(str);
printf("decoded: %s\n", str);
return 0;
}
输出结果为:
before: hello world
encoded: mjqqt%|twqi
decoded: hello world
🏷️ 5.4 实现字符串的加密和解密
除了简单的编码和解码外,也可以使用更加复杂的算法
,来保证字符串的安全性
。以下是一个例子:
#include <stdio.h>
#include <string.h>
void encrypt(char *str, char *key)
{
int i, j = 0, k = strlen(key);
char ch;
for (i = 0; i < strlen(str); i++) {
ch = str[i] + key[j] - 'a';
if (ch > 'z') {
ch -= 26;
}
str[i] = ch;
j = (j + 1) % k;
}
}
void decrypt(char *str, char *key)
{
int i, j = 0, k = strlen(key);
char ch;
for (i = 0; i < strlen(str); i++) {
ch = str[i] - key[j] + 'a';
if (ch < 'a') {
ch += 26;
}
str[i] = ch;
j = (j + 1) % k;
}
}
int main()
{
char str[] = "hello world";
char key[] = "abc";
printf("before: %s\n", str);
encrypt(str, key);
printf("encrypted: %s\n", str);
decrypt(str, key);
printf("decrypted: %s\n", str);
return 0;
}
输出结果为:
before: hello world
encrypted: hjgoh!lndsb
decrypted: hello world
总之,C语言中的字符串和字符处理
是一个非常重要
的部分,掌握字符串和字符处理技巧,能够为我们编写高效、实用的程序提供很大的帮助。
⚠️ 注意事项
-
字符串必须以
空字符'\0'结尾
,否则将无法正确处理字符串。 -
字符串
缓冲区需要足够大
,以容纳整个字符串及其结束符。 -
不要直接对字符串指针进行赋值或修改,因为字符串通常是
静态存储区的一部分
,这可能导致意外的行为或程序崩溃。 -
不要使用
strcpy函数复制字符串
,因为它没有进行足够的容错检查
,容易导致缓冲区溢出。 -
建议使用
strncpy函数来复制字符串
,因为它可以指定要复制的字符数
,避免了缓冲区溢出的风险。 -
在
比较字符串
时,不要使用“==
”运算符,因为它只比较两个指针是否相同
,而不比较它们所指向的字符串是否相同
。建议使用strcmp
函数来比较字符串。
上一篇:数组和指针
下一篇:文件操作
🎀小结
C语言字符串是由一串字符
组成的,可以使用双引号
将其括起来。可以使用字符串函数
来进行字符串处理,常见的字符串函数包括strlen
、strcpy
、strcat
等。在处理字符串时,需要注意字符串末尾的空字符'\0'
。
字符处理
是指对字符
进行操作的过程,包括字符的输入
、输出
、比较
等。C语言中字符使用单引号
括起来,并且字符是一个字符常量
。常见的字符处理函数包括getchar
、putchar
、isalpha
、isdigit
等。
🔚以上就是C语言字符串和字符处理
的全部知识了~
🤗感谢大家的阅读~
📬后续还会继续更新💓,欢迎持续关注哟~📌
💫如果有错误❌,欢迎指正呀💫
✨如果觉得收获满满,可以点点赞👍支持一下哟~✨