STLG_01_10_程序设计C语言 - 字符串

news2025/1/7 7:43:47

在C语言中,字符串是非常重要的数据类型,它们用于存储和操作文本数据。由于C语言没有内置的字符串类型,因此字符串是通过字符数组来实现的。

1. 字符串的基本概念

  • 字符数组:C语言中的字符串实际上是一个字符数组,字符数组的最后一个元素必须是空字符('\0'),它表示字符串的结束。

    char str[] = "Hello, World!";
    

    在这个例子中,str是一个字符数组,存储了字符串"Hello, World!"。C语言会在字符串末尾自动添加一个'\0'

  • 字符指针:字符串也可以用字符指针来表示,指向字符串常量的首地址。

    char *str = "Hello, World!";
    

    与字符数组不同,这里str是一个指向字符串常量的指针,这个字符串常量是不可修改的。

2. 字符串的输入输出

  • printf():用于格式化输出字符串。

    printf("%s\n", str);
    
  • scanf():用于从标准输入读取字符串。

    char str[100];
    scanf("%s", str);  // 读取字符串到str
    

    注意scanf()读取字符串时,遇到空格或换行符会停止读取,因此它不能读取带有空格的字符串。可以使用gets()fgets()来读取包含空格的字符串。

  • gets()(已废弃,不推荐使用):用于读取包含空格的字符串。

    char str[100];
    gets(str);  // 读取字符串到str
    

    警告gets()函数不安全,因为它不检查数组边界,容易导致缓冲区溢出。建议使用fgets()

  • fgets():安全的字符串输入函数。

    char str[100];
    fgets(str, sizeof(str), stdin);  // 从标准输入读取字符串到str
    

3. 字符串处理函数

C语言提供了许多字符串处理函数,这些函数定义在<string.h>头文件中。

  • strlen():返回字符串的长度(不包括'\0')。

    size_t len = strlen(str);  // 返回字符串的长度
    
  • strcpy():字符串复制。

    char src[] = "Hello";
    char dest[10];
    strcpy(dest, src);  // 将src复制到dest
    
  • strcat():字符串连接。

    char s1[50] = "Hello, ";
    char s2[] = "World!";
    strcat(s1, s2);  // s1变为"Hello, World!"
    
  • strcmp():字符串比较。

    int result = strcmp("apple", "banana");
    if (result < 0) {
        printf("apple小于banana\n");
    } else if (result > 0) {
        printf("apple大于banana\n");
    } else {
        printf("apple等于banana\n");
    }
    
  • strchr():查找字符串中首次出现的指定字符。

    char *p = strchr("Hello, World!", 'o');
    if (p) {
        printf("字符 'o' 在位置 %ld 处找到\n", p - "Hello, World!");
    }
    
  • strstr():查找字符串中首次出现的子字符串。

    char *p = strstr("Hello, World!", "World");
    if (p) {
        printf("子字符串 'World' 在位置 %ld 处找到\n", p - "Hello, World!");
    }
    

4. 常见问题与注意事项

  • 数组越界:在操作字符串时,必须确保目标数组有足够的空间来存储结果,否则会导致数组越界,引发未定义行为。

  • 字符串结束符'\0':手动操作字符串时,务必确保字符串以'\0'结束,否则会导致程序行为异常。

  • 字符串常量:字符串常量存储在只读存储区,不能修改。例如:

    char *str = "Hello, World!";
    *str = 'h';  // 错误:不能修改字符串常量
    

5. 字符串操作示例

下面是一个简单的示例,展示如何使用上述函数处理字符串:

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

int main() {
    char str1[50] = "Hello, ";
    char str2[] = "World!";
    char str3[50];

    // 复制字符串
    strcpy(str3, str1);
    printf("str3: %s\n", str3);

    // 连接字符串
    strcat(str1, str2);
    printf("str1: %s\n", str1);

    // 获取字符串长度
    size_t len = strlen(str1);
    printf("Length of str1: %zu\n", len);

    // 比较字符串
    int result = strcmp(str1, str2);
    if (result < 0) {
        printf("str1 is less than str2\n");
    } else if (result > 0) {
        printf("str1 is greater than str2\n");
    } else {
        printf("str1 is equal to str2\n");
    }

    // 查找字符
    char *p = strchr(str1, 'o');
    if (p) {
        printf("'o' found at position: %ld\n", p - str1);
    }

    // 查找子字符串
    char *sub = strstr(str1, "World");
    if (sub) {
        printf("Substring 'World' found at position: %ld\n", sub - str1);
    }

    return 0;
}

总结

C语言中的字符串是通过字符数组来实现的,字符串以'\0'结束。C语言提供了一系列的字符串处理函数,如strlen()strcpy()strcat()strcmp()等。在使用这些函数时,务必注意字符串的边界问题和结束符'\0'的处理。

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

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

相关文章

【机器遗忘之UNSIR算法】2023年IEEE Trans期刊论文:Fast yet effective machine unlearning

1 介绍 年份&#xff1a;2023 期刊&#xff1a;IEEE Transactions on Neural Networks and Learning Systems 引用量&#xff1a;170 Tarun A K, Chundawat V S, Mandal M, et al. Fast yet effective machine unlearning[J]. IEEE Transactions on Neural Networks and Le…

VSCode 在Windows下开发时使用Cmake Tools时输出Log乱码以及CPP文件乱码的终极解决方案

在Windows11上使用VSCode开发C程序的时候&#xff0c;由于使用到了Cmake Tools插件&#xff0c;在编译运行的时候&#xff0c;会出现输出日志乱码的情况&#xff0c;那么如何解决呢&#xff1f; 这里提供了解决方案&#xff1a; 当Settings里的Cmake: Output Log Encoding里设…

程序的环境(预处理详解)

一.程序的翻译环境和执行环境 在ANSI C&#xff08;标准c&#xff09;的任何一种实现中&#xff0c;存在两个不同的环境。 计算机是能够执行二进制指令的&#xff0c;但是我们写出的c语言代码是文本信息&#xff0c;计算机不能直接理解 第1种是翻译环境&#xff0c;在这个环境…

Kafka 消费者专题

目录 消费者消费者组消费方式消费规则独立消费主题代码示例&#xff08;极简&#xff09;代码示例&#xff08;独立消费分区&#xff09; offset自动提交代码示例&#xff08;自动提交&#xff09;手动提交代码示例&#xff08;同步&#xff09;代码示例&#xff08;异步&#…

解决 :VS code右键没有go to definition选项(转到定义选项)

问题背景&#xff1a; VScode 右键没有“go to definition”选项了&#xff0c;情况如图所示&#xff1a; 问题解决办法&#xff1a; 第一步&#xff1a;先检查没有先安装C/C插件&#xff0c;没有安装就先安装下。 第二步&#xff1a; 打开VS CODE设置界面&#xff1a;文件->…

网络安全的学习与实践经验(附资料合集)

学习资源 在线学习平台&#xff1a; Hack This Site&#xff1a;提供从初学者到高级难度的挑战任务&#xff0c;适合练习各种网络安全技术。XCTF_OJ&#xff1a;由XCTF组委会开发的免费在线网络安全网站&#xff0c;提供丰富的培训材料和资源。SecurityTube&#xff1a;提供丰…

《Rust权威指南》学习笔记(五)

高级特性 1.在Rust中&#xff0c;unsafe是一种允许绕过Rust的安全性保证的机制&#xff0c;用于执行一些Rust默认情况下不允许的操作。unsafe存在的原因是&#xff1a;unsafe 允许执行某些可能被 Rust 的安全性检查阻止的操作&#xff0c;从而可以进行性能优化&#xff0c;如手…

使用R语言绘制标准的中国地图和世界地图

在日常的学习和生活中&#xff0c;有时我们常常需要制作带有国界线的地图。这个时候绘制标准的国家地图就显得很重要。目前国家标准地图服务系统向全社会公布的标准中国地图数据&#xff0c;是最权威的地图数据。 今天介绍的R包“ggmapcn”&#xff0c;就是基于最新公布的地图…

Flutter踩坑记-第三方SDK不兼容Gradle 8.0,需适配namespace

最近需要集成Flutter作为Module&#xff0c;Flutter依赖了第三方库&#xff0c;Gradle是8.0版本。 编译报错&#xff1a; 解决办法是在.android根目录下的build.gradle下新增一行代码&#xff1a; buildscript {ext.kotlin_version "1.8.22"repositories {google()…

golang 编程规范 - 项目目录结构

原文&#xff1a;https://makeoptim.com/golang/standards/project-layout 目录结构 Go 目录 cmdinternalpkgvendor 服务端应用程序目录 api Web 应用程序目录 web 通用应用程序目录 buildconfigsdeploymentsinitscriptstest 其他目录 assetsdocsexamplesgithooksthird_par…

蓝桥杯备赛:C++基础,顺序表和vector(STL)

目录 一.C基础 1.第一个C程序&#xff1a; 2.头文件&#xff1a; 3.cin和cout初识&#xff1a; 4.命名空间&#xff1a; 二.顺序表和vector&#xff08;STL&#xff09; 1.顺序表的基本操作&#xff1a; 2.封装静态顺序表&#xff1a; 3.动态顺序表--vector&#xff1a;…

node.js之---事件循环机制

事件循环机制 Node.js 事件循环机制&#xff08;Event Loop&#xff09;是其核心特性之一&#xff0c;它使得 Node.js 能够高效地处理大量并发的 I/O 操作。Node.js 基于 非阻塞 I/O&#xff0c;使用事件驱动的模型来实现异步编程。事件循环是 Node.js 实现异步编程的基础&…

如何在 Ubuntu 22.04 上部署 Nginx 并优化以应对高流量网站教程

简介 本教程将教你如何优化 Nginx&#xff0c;使其能够高效地处理高流量网站。 Nginx 是一个强大且高性能的 Web 服务器&#xff0c;以其高效处理大量并发连接的能力而闻名&#xff0c;这使得它成为高流量网站的流行选择。 正确优化 Nginx 可以显著提高服务器的性能&#xff0…

AIRemoveBackground:用 AI 技术轻松去除背景图的前端程序

在当今数字化时代&#xff0c;图像处理技术不断发展&#xff0c;其中 AI 去除背景图的功能备受关注。本文将介绍一款名为 AIRemoveBackground 的前端程序&#xff0c;它利用人工智能技术&#xff0c;为用户提供便捷、高效的背景去除解决方案。 一、简介 随着互联网的普及和多媒…

【踩坑指南2.0 2025最新】Scala中如何在命令行传入参数以运行主函数

这个地方基本没有任何文档记录&#xff0c;在学习的过程中屡屡碰壁&#xff0c;因此记录一下这部分的内容&#xff0c;懒得看可以直接跳到总结看结论。 踩坑步骤 首先来看看书上让我们怎么写&#xff1a; //main.scala object Start {def main(args:Array[String]) {try {v…

Excel VBA 自动填充空白并合并相同值的解决方案

文章目录 Excel VBA: 自动填充空白并合并相同值的解决方案问题背景解决方案1. VBA代码实现2. 代码说明3. 使用方法4. 注意事项 扩展优化总结 Excel VBA: 自动填充空白并合并相同值的解决方案 问题背景 在Excel中经常会遇到这样的数据处理需求&#xff1a;一列数据中存在多个空…

SpringSecurity中的过滤器链与自定义过滤器

关于 Spring Security 框架中的过滤器的使用方法,系列文章: 《SpringSecurity中的过滤器链与自定义过滤器》 《SpringSecurity使用过滤器实现图形验证码》 1、Spring Security 中的过滤器链 Spring Security 中的过滤器链(Filter Chain)是一个核心的概念,它定义了一系列过…

【STC库函数】Compare比较器的使用

如果我们需要比较两个点的电压&#xff0c;当A点高于B点的时候我们做一个操作&#xff0c;当B点高于A点的时候做另一个操作。 我们除了加一个运放或者比较器&#xff0c;还可以直接使用STC内部的一个比较器。 正极输入端可以是P37、P50、P51&#xff0c;或者从ADC的十六个通道…

Postgresql 命令还原数据库

因为PgAdmin打不开&#xff0c;但是数据库已经安装成功了&#xff0c;这里借助Pg命令来还原数据库 C:\Program Files\PostgreSQL\15\bin\psql.exe #链接数据库 psql -U postgres -p 5432#创建数据库 CREATE DATABASE "数据库名称"WITHOWNER postgresENCODING UTF8…

Backend - C# 的日志 NLog日志

目录 一、注入依赖和使用 logger 二、配置记录文件 1.安装插件 NLog 2.创建 nlog.config 配置文件 3. Programs配置日志信息 4. 设置 appsettings.json 的 LogLevel 5. 日志设定文件和日志级别的优先级 &#xff08;1&#xff09;常见的日志级别优先级 &#xff08;2&…