c语言 --- 字符串

创建字符串

1. 使用字符数组创建字符串

#include <stdio.h>int main() {char str[20] = "Hello, world!";str[0] = 'h'; // 修改字符串的第一个字符printf("%s\n", str); // 输出:hello, world!return 0;
}

解释

  • 数组大小 20 表示可以存储 20 个字符(包括末尾的 \0)。
  • 初始化时,编译器会自动在字符串末尾添加空字符 '\0'

2. 直接初始化字符串常量 

#include <stdio.h>int main() {char *str = "Hello, world!"; // 指针指向字符串常量printf("%s\n", str);return 0;
}

解释

  • char *str 指向的是字符串常量,字符串常量在内存中的只读区域(通常为代码段)存储。
  • 通过指针的方式无法修改字符串内容(试图修改会导致未定义行为)。

3. 动态分配内存创建字符串

#include <stdio.h>
#include <stdlib.h>int main() {char *str = (char *)malloc(20 * sizeof(char)); // 动态分配内存if (str == NULL) {printf("内存分配失败\n");return 1;}// 初始化字符串for (int i = 0; i < 5; i++) {str[i] = 'A' + i; // 分别赋值 A, B, C, D, E}str[5] = '\0'; // 添加结束符printf("%s\n", str); // 输出:ABCDEstr[0] = 'Z'; // 修改第一个字符printf("%s\n", str); // 输出:ZBCDEfree(str); // 释放内存return 0;
}

解释

  • malloc 动态分配内存,适合字符串长度在运行时不确定的场景。
  • 使用完动态分配的内存后,记得调用 free 释放内存。

4. 手动逐个字符赋值的数组

#include <stdio.h>int main() {char str[6];str[0] = 'H';str[1] = 'e';str[2] = 'l';str[3] = 'l';str[4] = 'o';str[5] = '\0';str[0] = 'h'; // 修改第一个字符printf("%s\n", str); // 输出:helloreturn 0;
}

总结

创建方式存储位置是否可修改内容
字符数组(如 char str[]栈内存可以
指向字符串常量的指针(如 char *只读内存不可以(未定义行为)
动态分配的字符串(如 malloc堆内存可以
逐个字符赋值的数组栈内存可以

 

c语言中常用的处理字符串的函数

1. 字符串复制

strcpy()
  • 功能:将一个字符串复制到另一个字符串中。
  • 原型char *strcpy(char *dest, const char *src);
  • 示例:
char dest[20];
char src[] = "Hello";
strcpy(dest, src);
printf("Copied string: %s\n", dest); // 输出:Copied string: Hello

注意:目标字符串 dest 必须足够大,以容纳源字符串和末尾的 '\0'

strncpy()
  • 功能:复制字符串,但限制复制的最大长度。
  • 原型char *strncpy(char *dest, const char *src, size_t n);
  • 示例
char dest[10];
char src[] = "HelloWorld";
strncpy(dest, src, 5);
dest[5] = '\0'; // 确保手动添加 '\0'
printf("Partial copy: %s\n", dest); // 输出:Partial copy: Hello

2. 字符串拼接

strcat()
  • 功能:将源字符串拼接到目标字符串的末尾。
  • 原型char *strcat(char *dest, const char *src);
  • 示例
char dest[20] = "Hello, ";
char src[] = "World!";
strcat(dest, src);
printf("Concatenated string: %s\n", dest); // 输出:Concatenated string: Hello, World!
strncat()
  • 功能:拼接字符串,但限制拼接的最大长度。
  • 原型char *strncat(char *dest, const char *src, size_t n);
  • 示例
char dest[20] = "Hello, ";
char src[] = "World!";
strncat(dest, src, 3);
printf("Partially concatenated string: %s\n", dest); // 输出:Partially concatenated string: Hello, Wor

3. 字符串长度

strlen()
  • 功能:获取字符串的长度(不包括 '\0')。
  • 原型size_t strlen(const char *str);
  • 示例
char str[] = "Hello";
printf("Length of string: %zu\n", strlen(str)); // 输出:Length of string: 5

4. 字符串比较

strcmp()
  • 功能:比较两个字符串。
    • 如果 str1 小于 str2,返回负值。
    • 如果 str1 等于 str2,返回 0。
    • 如果 str1 大于 str2,返回正值。
  • 原型int strcmp(const char *str1, const char *str2);
  • 示例
char str1[] = "abc";
char str2[] = "abcd";
printf("Comparison result: %d\n", strcmp(str1, str2)); // 输出:Comparison result: -1
strncmp()
  • 功能:比较两个字符串的前 n 个字符。
  • 原型int strncmp(const char *str1, const char *str2, size_t n);
  • 示例
char str1[] = "abcdef";
char str2[] = "abcxyz";
printf("Comparison result: %d\n", strncmp(str1, str2, 3)); // 输出:Comparison result: 0

5. 字符串查找

strchr()
  • 功能:查找字符在字符串中首次出现的位置。
  • 原型char *strchr(const char *str, int c);
  • 示例
char str[] = "Hello World";
char *pos = strchr(str, 'o');
if (pos) {printf("Found 'o' at position: %ld\n", pos - str); // 输出:Found 'o' at position: 4
}
strstr()
  • 功能:查找子字符串在字符串中首次出现的位置。
  • 原型char *strstr(const char *haystack, const char *needle);
  • 示例
char str[] = "Hello World";
char *pos = strstr(str, "World");
if (pos) {printf("Found substring at position: %ld\n", pos - str); // 输出:Found substring at position: 6
}

6. 字符串转化

atoi()
  • 功能:将字符串转换为整数。
  • 原型int atoi(const char *str);
  • 示例
char str[] = "123";
int num = atoi(str);
printf("Converted number: %d\n", num); // 输出:Converted number: 123
sprintf()
  • 功能:格式化输出到字符串中。
  • 原型int sprintf(char *str, const char *format, ...);
  • 示例
char buffer[50];
int num = 123;
sprintf(buffer, "Number: %d", num);
printf("%s\n", buffer); // 输出:Number: 123

7. 内存操作

memcpy()
  • 功能:复制内存区域。
  • 原型void *memcpy(void *dest, const void *src, size_t n);
  • 示例
char src[] = "Hello";
char dest[10];
memcpy(dest, src, 6); // 复制 6 个字节,包括 '\0'
printf("Copied string: %s\n", dest); // 输出:Copied string: Hello
memset()
  • 功能:将内存区域设置为指定的值。
  • 原型void *memset(void *s, int c, size_t n);
  • 示例
char buffer[10];
memset(buffer, 'A', 9);
buffer[9] = '\0';
printf("Buffer: %s\n", buffer); // 输出:Buffer: AAAAAAAAA

 

memcpy() 操作结构体的使用场景

1. 复制结构体

当需要将一个结构体的数据复制到另一个结构体时,可以使用 memcpy()

示例:

#include <stdio.h>
#include <string.h>typedef struct {int id;char name[20];float score;
} Student;int main() {Student s1 = {1, "Alice", 95.5};Student s2;// 使用 memcpy 复制结构体memcpy(&s2, &s1, sizeof(Student));// 打印结果验证printf("s2.id: %d, s2.name: %s, s2.score: %.2f\n", s2.id, s2.name, s2.score);return 0;
}

输出: 

s2.id: 1, s2.name: Alice, s2.score: 95.50

memset() 操作结构体的常见用法

1. 清零结构体
  • 将结构体的所有成员清零是最常见的用途。

  • 示例:

 

#include <stdio.h>
#include <string.h>typedef struct {int id;char name[20];float score;
} Student;int main() {Student s;// 使用 memset 清零结构体memset(&s, 0, sizeof(Student));// 打印结果printf("id: %d, name: %s, score: %.2f\n", s.id, s.name, s.score);return 0;
}

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

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

相关文章

1月13日学习

[HITCON 2017]SSRFme 直接给了源代码&#xff0c;题目名称还是ssrf&#xff0c;那么该题大概率就是SSRF的漏洞&#xff0c;进行代码审计。 <?php// 检查是否存在 HTTP_X_FORWARDED_FOR 头&#xff0c;如果存在&#xff0c;则将其拆分为数组&#xff0c;并将第一个 IP 地址…

linux RT-Preempt spin lock实现

一、spin_lock概述 Spinlock是linux内核中常用的一种互斥锁机制&#xff0c;和mutex不同&#xff0c;当无法持锁进入临界区的时候&#xff0c;当前执行线索不会阻塞&#xff0c;而是不断的自旋等待该锁释放。正因为如此&#xff0c;自旋锁也是可以用在中断上下文的。也正是因为…

设计模式-工厂模式/抽象工厂模式

工厂模式 定义 定义一个创建对象的接口&#xff0c;让子类决定实列化哪一个类&#xff0c;工厂模式使一个类的实例化延迟到其子类&#xff1b; 工厂方法模式是简单工厂模式的延伸。在工厂方法模式中&#xff0c;核心工厂类不在负责产品的创建&#xff0c;而是将具体的创建工作…

C++ 文字识别OCR

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…

计算机网络 (39)TCP的运输连接管理

前言 TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的传输协议&#xff0c;它在计算机网络中扮演着至关重要的角色。TCP的运输连接管理涉及连接建立、数据传送和连接释放三个阶段。 一、TCP的连接建立 TCP的连接建立采用三次握手机制&#xff0c;其过程如下&…

机器学习(1):线性回归概念

1 线性回归基础 1.1 什么是线性 例如&#xff1a;汽车每小时60KM&#xff0c;3小时可以行使多长距离&#xff1f;已知汽车的速度&#xff0c;则汽车的行使距离只与时间唯一相关。在二元的直角坐标系中&#xff0c;描出这一关系的图是一条直线&#xff0c;所以称为线性关系。 线…

1,Linux环境变量基本定义(基于Ubuntu示例进行讲解)

linux环境变量的概念 Linux环境变量&#xff08;准确说应该是shell变量&#xff09;&#xff0c;是直接存储在操作系统中的一组键值对&#xff08;dict类型&#xff09;&#xff0c;用于配置系统和应用程序的操作行为。 【有经验的描述】&#xff1a;它们的工作原理很简单&am…

STM32入门教程-示例程序(按键控制LED光敏传感器控制蜂鸣器)

1. LED Blink&#xff08;闪烁&#xff09; 代码主体包含&#xff1a;LED.c key.c main.c delay.c&#xff08;延时防按键抖动&#xff09; 程序代码如下&#xff08;涉及RCC与GPIO两个外设&#xff09;&#xff1a; 1.使用RCC使能GPIO时钟 RCC_APB2PeriphClockC…

java springboot3.x jwt+spring security6.x实现用户登录认证

springboot3.x jwtspring security6.x实现用户登录认证 什么是JWT JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它用于在网络应用环境中传递声明。通常&#xff0c;JWT用于身份验证和信息交换。JWT的一个典型用法是…

基于Socket和ServerSocket自定义协议的实现多端通信、消息发送、群聊发送

通信基础 Socket Socket套接字是实现网络通信的重要接口&#xff0c;Socket绑定的应用进程&#xff0c;目标Ip的端口号&#xff0c;以及数据传输对应的输入输出缓冲区。一个数据包到达一台计算机物理设备后&#xff0c;经过网络协议栈的解析&#xff0c;然后由操作系统调度到对…

【Uniapp-Vue3】Prop校验与prop默认值用法及循环遍历数组对象

一、prop校验 如果我们在想要限制prop的类型&#xff0c;就可以在接收prop的时候对接收类型进行限制&#xff1a; defineProps({ 属性名:{ type:类型 } }) 需要注意类型的首字母大写 但是设置了传入参数类型限制并不能严格限制&#xff0c;只会在后台进行提示&#xff1a; 二、…

Java Stream流操作List全攻略:Filter、Sort、GroupBy、Average、Sum实践

在Java 8及更高版本中&#xff0c;Stream API为集合处理带来了革命性的改变。本文将深入解析如何运用Stream对List进行高效的操作&#xff0c;包括筛选&#xff08;Filter&#xff09;、排序&#xff08;Sort&#xff09;、分组&#xff08;GroupBy&#xff09;、求平均值&…

ExplaineR:集成K-means聚类算法的SHAP可解释性分析 | 可视化混淆矩阵、决策曲线、模型评估与各类SHAP图

集成K-means聚类算法的SHAP可解释性分析 加载数据集并训练机器学习模型 SHAP 分析以提取特征对预测的影响 通过混淆矩阵可视化模型性能 决策曲线分析 模型评估&#xff08;多指标和ROC曲线的目视检查&#xff09; 带注释阈值的 ROC 曲线 加载 SHAP 结果以进行下游分析 与…

【Python通过UDP协议传输视频数据】(界面识别)

提示&#xff1a;界面识别项目 前言 随着网络通信技术的发展&#xff0c;视频数据的实时传输在各种场景中得到了广泛应用。UDP&#xff08;User Datagram Protocol&#xff09;作为一种无连接的协议&#xff0c;凭借其低延迟、高效率的特性&#xff0c;在实时性要求较高的视频…

浅谈云计算03 | 云计算的技术支撑(云使能技术)

云计算的技术支撑 一、定义与内涵1.1 定义与内涵 二、云计算使能技术架构2.1 宽带网络和 Internet 架构2.2 数据中心技术2.3 虚拟化技术2.4 Web 技术2.5 多租户技术2.6 服务技术 一、定义与内涵 1.1 定义与内涵 云计算技术包含一些基础的关键技术&#xff0c;这里称为使能技术…

QGraphicsView QGraphicsScene QGraphicsItem

QGraphicsView && QGraphicsScene &#xff1a; QGraphicsView 是 Qt 中用于显示和交互处理 2D 图形的控件&#xff0c;QGraphicsView 用于显示 QGraphicsScene 中的内容。 .h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include &…

【大数据】机器学习-----线性模型

一、线性模型基本形式 线性模型旨在通过线性组合输入特征来预测输出。其一般形式为&#xff1a; 其中&#xff1a; x ( x 1 , x 2 , ⋯ , x d ) \mathbf{x}(x_1,x_2,\cdots,x_d) x(x1​,x2​,⋯,xd​) 是输入特征向量&#xff0c;包含 d d d 个特征。 w ( w 1 , w 2 , ⋯ ,…

基于千帆(ERNIE-Functions-8K)Function Calling的简单使用

1.Function Calling是什么&#xff1f; 1.1 概念 Function calling是一种将LLM(大语言模型Large language model)连接外部工具的能力&#xff0c;LLM经过微调后&#xff0c;可以检测出何时需要调用函数以及需要调用函数的方法名及参数&#xff0c;并返回给调用方以便调用外部…

Deep Attentional Guided Image Filtering

This work achieved the first place in the real depth map SR challenge held in ACM ICMR 2021. 目的&#xff1a;从一个target image(如低分辨的深度图)和guidance image(如高分辨的RGB图)&#xff0c;得到输出(如高分辨的深度图)。 主要思想是考虑了target和guidance之间的…

SpringBoot+Lombok项目实体属性名xXxx格式,前端接收不到

问题解析 今天发现后端传给前端的实体类中&#xff0c;有属性为xXxxx格式的&#xff0c;前端也使用相同名称接收&#xff0c;结果却不显示值&#xff01;研究了一会发现接口请求回来后&#xff0c;原xXxxx的属性名&#xff0c;会被转为全小写。具体原因为&#xff1a;使用Lombo…