【C语言】基础语法6:字符串和字符处理

news2025/1/9 16:51:01

上一篇:数组和指针
下一篇:文件操作

❤️‍🔥前情提要❤️‍🔥
  欢迎来到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(&reg, pattern, REG_EXTENDED|REG_NEWLINE);
    if (ret != 0) {
        printf("compile failed\n");
        return -1;
    }

    ret = regexec(&reg, 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(&reg);

    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语言字符串是由一串字符组成的,可以使用双引号将其括起来。可以使用字符串函数来进行字符串处理,常见的字符串函数包括strlenstrcpystrcat等。在处理字符串时,需要注意字符串末尾的空字符'\0'

字符处理是指对字符进行操作的过程,包括字符的输入输出比较等。C语言中字符使用单引号括起来,并且字符是一个字符常量。常见的字符处理函数包括getcharputcharisalphaisdigit等。

🔚以上就是C语言字符串和字符处理的全部知识了~

🤗感谢大家的阅读~

📬后续还会继续更新💓,欢迎持续关注哟~📌

💫如果有错误❌,欢迎指正呀💫

✨如果觉得收获满满,可以点点赞👍支持一下哟~✨


在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/457955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redis7 安装 与 启动

文章目录 1. redis 的 概述2. redis 的 安装3. redis 的启动4. redis 的卸载 1. redis 的 概述 redis : 是 远程 词典服务器 &#xff0c;是 一个基于内存的 键值型 Nosql 数据库. 官方解释 : Remote Dictionary Server(远程字典服务)是完全开源的&#xff0c;使用ANSIC语言编写…

QMS-云质说质量 - 6 中小企业常用的结构化问题解决方法有哪些?

云质QMS原创 转载请注明来源 作者&#xff1a;王洪石 引言 爱因斯坦如何解决问题 面对问题时&#xff0c;有的人可能很盲目地开始行动&#xff0c;干到一定程度&#xff0c;却突然发现自己所做的是无用功。 有人问过科学巨匠爱因斯坦&#xff0c;如果给他一个关系到他生命的问…

R基础函数概览(一)

rep 函数形式&#xff1a;rep(x, time , length , each ,) 参数说明&#xff1a; x&#xff1a;代表的是你要进行复制的对象&#xff0c;可以是一个向量或者是一个因子。 times&#xff1a;代表的是复制的次数&#xff0c;只能为正数。负数以及NA值都会为错误值。复制是指的…

[oeasy]python0139_尝试捕获异常_ try_except_traceback

尝试捕获异常 回忆上次内容 变量相加 整型数字变量可以相加字符串变量也可以拼接 但是 字符串 和 整型数字整型数字 和 字符串不能相加 怎么办&#xff1f; 转格式int(“1”)str(2) 可是 如果输入的苹果数量是 字符串"abc" int(“abc”)会发生什么&#xff1f;&…

通信算法之149:EVM测量

1.星座图 h scatterplot(sqrt(sps)*txSig(sps*span1:end-sps*span),sps,offset); hold on scatterplot(rxSigFilt(span1:end-span),n,offset,bx,h) scatterplot(dataMod,n,offset,r,h) legend(Transmit Signal,Received Signal,Ideal,location,best) 2. 眼图 Eye Diagram D…

华为OD机试真题(Java),简单密码(100%通过+复盘思路)

一、题目描述 现在有一种密码变换算法。 九键手机键盘上的数字与字母的对应&#xff1a; 1--1&#xff0c; abc--2, def--3, ghi--4, jkl--5, mno--6, pqrs--7, tuv--8 wxyz--9, 0--0&#xff0c;把密码中出现的小写字母都变成九键键盘对应的数字&#xff0c;如&#xff1a;a …

C++ -4- 类和对象(下)

文章目录 1.初始化列表什么是初始化列表&#xff1f;初始化列表的 意义及使用 2.explicit关键字单参数构造函数&#xff08;C98&#xff09;多参数的构造函数&#xff08;C11&#xff09;&#xff08;了解&#xff09; 3.static静态成员静态成员变量与静态成员函数静态成员变量…

Java并发(三)----创建线程的三种方式及查看进程线程

一、直接使用 Thread // 创建线程对象 Thread t new Thread() {public void run() {// 要执行的任务} }; // 启动线程 t.start(); 例如&#xff1a; // 构造方法的参数是给线程指定名字&#xff0c;推荐 Thread t1 new Thread("t1") {Override// run 方法内实现…

Codeforces Round 864 (Div. 2)(A~D)

A. Li Hua and Maze 给出两个不相邻的点&#xff0c;最少需要堵上几个方格&#xff0c;才能使得两个方格之间不能互相到达。 思路&#xff1a;显然&#xff0c;对于不邻任何边界的方格来说&#xff0c;最少需要的是4&#xff0c;即上下左右都堵上&#xff1b;邻一个边界就-1&a…

Python樱花树

文章目录 前言一、Turtle基础1.1 Turtle画板1.2 Turtle画笔1.3 Turtle画图1.4 Turtle填色1.5 Turtle写字 二、Python樱花树2.1 樱花类2.2 樱花树2.3 主函数2.4 程序分析2.5 樱花林 尾声 前言 粉色系最爱&#xff01;Python樱花树等你获取~ 哈喽小伙伴们好久不见啦&#xff0c;…

几何感知Transformer用于3D原子系统建模

基于机器学习的方法在预测分子能量和性质方面表现出很强的能力。分子能量至少与原子、键、键角、扭转角和非键原子对有关。以前的Transformer模型只使用原子作为输入&#xff0c;缺乏对上述因素的显式建模。为了减轻这种限制&#xff0c;作者提出了Moleformer&#xff0c;这是一…

ChatGPT课程送账号啦,让你成为新生代AI程序员

ChatGPT能帮助程序员 解决哪些具体问题&#xff1f; 程序员在日常工作中可能会遇到各种各样的问题&#xff0c;如语法错误、逻辑问题、性能问题等等。 不同业务场景的问题&#xff0c;都可以利用ChatGPT获取各自场景下的知识&#xff0c;并使用ChatGPT提供的代码示例和问题解…

S32K3系列单片学习LPSPI是什么

前言 通过前面的学习&#xff0c;已经可以实现最基础的引脚配置功能了&#xff0c;并实现了点亮LED的程序。下面将记录一下&#xff0c;S32K3的SPI模块的配置方法&#xff0c;以及注意事项。 一、LPSPI介绍 **LPSPI:LOW POWER Serial Peripheral Interface**1.概述 所有LPS…

Unity3d数字化看板-多关节机器人运动控制

特殊&#xff1a;机器人多关节跟随运动 机械手运动控制主要是关节的旋转&#xff0c;通过控制多个关节的角度&#xff0c;实现对机械手的同步控制 机械手运动控制&#xff0c;可以分解为多个关节的运动&#xff0c;下一关节是跟随在上一关节运动&#xff0c;在处理模型的时候…

小案例CSS

代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content"IEedge"> <meta name"viewport" content"widthde…

一个基于 go 实现的轻量级任务调度框架

github 地址&#xff1a;GitHub - memory-overflow/light-task-scheduler: 一个go语言的轻量级的快速实现任务调度的框架&#xff0c;并且支持有状态任务的持久化&#xff0c;并发控制和超时控制。 框架的设计思想和背景 业务后台开发&#xff0c;经常会遇到很多并发低&#…

QT笔记——属性栏之QtPropertyBrowser下载配置

我们常常看到Qt Designer如下图&#xff0c;属性栏 环境&#xff1a;vs2019 qt 5.12.2 QtPropertyBrowser 下面我将介绍如何去下载和安装配置 QtPropertyBrowser&#xff0c;使用的是.dll和.lib 第一种方式&#xff1a;编译qt4 源码的方式 然后修改为qt5 的形式 第一步&am…

Ext JS 4实现合并行单元格

目录 文件 最后由 oscar999 在 几秒前 编辑 有一位朋友咨询了一个问题: 在Ext JS 4中, 如何合并行的单元格, 已经选取的时候只能选择某一列, 期望的效果如下: 在Ext JS 中, 合并表头的列有现成方案, 但是合并行单元格不是extjs的现有功能,这个需要底层扩展, 也就是使…

云原生(docker+k8s+阿里云)-Docker

Gitee-Kubernetes学习 kubectl备忘清单 k8s官方文档-task [云原生-kubectl命令详解] ingress详解 ingress官方文档 云原生-语雀-架构师第一课 从Docker到Kubernetes进阶-社区 云计算学习路线-阿里云大学 如上图&#xff0c;服务器有公网ip和私网ip&#xff0c;公网ip是外部访问…

AWT-对话框——Dialog以及其子类FileDialog

Dialog: Dialog时Window类的子类&#xff0c;时一个容器类&#xff0c;属于特殊组件。对话框是可以独立存在的顶级窗口&#xff0c;因此用法与普通窗口的用法几乎完全一样&#xff0c;但是使用对话框需要注意以下几点&#xff1a; 对话框通常依赖于其它窗口&#xff0c;就是通…