C语言中操作字符串的函数详解

目录
  • 一、函数表
  • 二、strlen
    • 实例
  • 三、strcmp
    • 实例
  • 四、strcpy
    • 实例
  • 五、stract
    • 实例
  • 六、strchr
    • 实例
  • 总结

一、函数表

函数名 函数 功能
strlen size_t strlen(const char* s); 返回字符串 s 的长度(不包括结尾的0)
strcmp int strcmp(const char* s1, const char* s2); 比较两个字符串,返回:如果 s1 == s2,返回 0;如果 s1<s2 则返回小于 0 (如 -1);如果 s1>s2 则返回大于 0 (如 1)
strcpy char* strcpy(char* restrict dst, const char* reestrict src) 把字符串 src 复制拷贝到字符串 dst,返回 dst,restrict 表明 src 和 dst 不能重叠
strcat char* stract(char* restrict s1, const char* reestrict s2) 把字符串 s2 拷贝到字符串 s1 的后面,连接成一个长的字符串,返回 s1
strchr char* strchr(const char* s, int c) 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置
strstr char* strstr(const char* s1, const char* s2) 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置

二、strlen

实例

#include <stdio.h>
#include <string.h>
//自定义 strlen()函数
size_t mylen(const char* s)
{
	int idx = 0;
	while (s[idx] != '\0') {
		idx++;
	}
	return idx;
}
int main()
{
	char a[] = "Hello";
	printf("mylen=%llu\n", mylen(a));
	printf("strlen=%llu\n", strlen(a));// {'H', 'e', 'l', 'l', 'o'};
	printf("sizeof=%llu\n", sizeof(a));// {'H', 'e', 'l', 'l', 'o','\0'};
	return 0;
}

运行结果

三、strcmp

实例

#include <stdio.h>
#include <string.h>
//自定义 strcmp()函数
int mycmp1(const char* s1, const char* s2)
{
	int idx = 0;
	while (1) {
		if (s1[idx] != s2[idx]) {
			break;
		}
		else if (s1[idx] == '\0') {
			break;
		}
		idx++;
	}
	return s1[idx] - s2[idx];
}
int mycmp2(const char* s1, const char* s2)
{
	int idx = 0;
	while (s1[idx] == s2[idx] && s1[idx] != 0) {
		idx++;
	}
	return s1[idx] - s2[idx];
}
int mycmp3(const char* s1, const char* s2)
{
	int idx = 0;
	while (*s1 == *s2 && *s1 != 0) {
		s1++;
		s2++;
	}
	return *s1 - *s2;
}
int main()
{
	char s1[] = "abc";
	char s2[] = "abc";
	char s3[] = "abc ";
	char s4[] = "bbc";
	char s5[] = "Abc";
	printf("mycmp1=%d\n", mycmp1(s1, s2));
	printf("mycmp2=%d\n", mycmp2(s1, s3));
	printf("mycmp3=%d\n", mycmp3(s1, s4));
	printf("mycmp3=%d\n", mycmp3(s1, s5));
	printf("strlen=%d\n", strcmp(s1, s2));
	printf("strlen=%d\n", strcmp(s1, s3));
	printf("strlen=%d\n", strcmp(s1, s4));
	printf("strlen=%d\n", strcmp(s1, s5));
	return 0;
}

运行结果

VS编辑器的原因,库函数 strlen 的结果只有 0, -1, 1 三种结果

四、strcpy

// 复制一个字符串
char* dst = (char*)malloc(strlen(src)+1);
strcpy(dst,src);
// strlen 查 src 大小 +1 (+1 的原因是加上字符串最后的 ‘\0', strlen 读取的长度不包括 ‘\0'), 再 malloc 分配空间给 dst, 这样 dst 的空间正好等于 src, 然后再执行 strcpy 复制操作

实例

#include <stdio.h>
#include <string.h>
//自定义 strcpy()函数
char* mycpy1(char* dst, const char* src)
{
	int idx = 0;
	while (src[idx] != '\0') {
		dst[idx] = src[idx];
		idx++;
	}
	dst[idx] = '\0';
	return dst;
}
char* mycpy2(char* dst, const char* src)
{
	char* ret = dst;
	while (*src) {
		*dst++ = *src++;
	}
	*dst = '\0';
	return ret;
}
int main()
{
	char s1[] = "abc";
	char s2[] = "def";
	char s3[] = "ghi";
	char s4[] = "jkl";
	printf("s1=%s\n", s1);
	strcpy(s1, s2);
	printf("s1=%s\n", s1);
	mycpy1(s1, s3);
	printf("s1=%s\n", s1);
	mycpy2(s1, s4);
	printf("s1=%s\n", s1);
	return 0;
}

运行结果

五、stract

实例

#include <stdio.h>
#include <string.h>
int main()
{
	char s1[10] = "abc";
	char s2[] = "def";
	printf("s1=%s\n", s1);
	strcat(s1, s2);
	printf("s1=%s\n", s1);
	return 0;
}

运行结果

六、strchr

实例

#include <stdio.h>
#include <string.h>
int main()
{
	char s1[10] = "abcdebcde";
	printf("%p\n", s1);
	printf("%p\n", s1 + 1);
	char* p = strchr(s1, 'b');
	printf("%s\n", p);
	printf("%p\n", p);
	return 0;
}

运行结果

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C语言中dlopen和dlsym的使用方式详解

    目录 背景 demo 生产动态库 调用dlopen 总结 背景 为了是不同的逻辑解耦,一般会把各个业务封装成动态库,然后主逻辑去调用各个插件.这里有个问题是,为什么以前我们都是通过include第三方的头文件,然后通过连接器实现,现在却要利用dlopen呢?考虑以下情况,比如我们要用cublas这个库的sgemm函数. #include "cublas.h" int main() { cublas:: Mat a, b; cublas::sgemm(a,b); } 我们知道cublas

  • C语言三个函数的模拟实现详解

    目录 一.strcpy 二.模拟实现strcat 三.strcmp 总结: 一.strcpy //模拟实现strcpy #include<stdio.h> #include<assert.h> char* my_strcpy(char*dest, char*str) { assert(dest && str); char* tmp = dest; while (*str != '\0') { *dest = *str; dest++; str++; } *dest

  • C语言 超详细讲解库函数

    目录 1 返回整数的getchar函数 2 更新顺序文件 3 缓冲输出与内存分配 4 库函数 练习 1 返回整数的getchar函数 代码: #include<stdio.h> int main() { char c; while((c = getchar())!=EOF)//getchar函数的返回值为整型 putchar(c); return 0; } 上述代码有三种可能: 某些合法的输入字符在被"截断"后使得c的取值与EOF相同,程序将在复制的中途停止. c根本不可能

  • C语言的数组指针与函数指针详解

    目录 前言 函数指针语法 数组指针与指针数组 总结 前言 数组指针和函数指针都是C语言比较难的知识点,尤其是函数指针,并且函数指针在开发中有着巨大的作用. 函数指针语法 定义一个函数指针,并通过函数指针间接调用函数: int get_num(int a, int b) { return a + b; } int (*func)(int a, int b); //定义了一个函数指针func,它指向 返回值为int 参数为 int a, int b的函数 func = &get_num; //函数指

  • C语言中回调函数的使用详情

    目录 1.程序架构 2.回调函数的作用 3.掌握回调函数的程序编写 4.回调函数在产品中的应用 下文将学习到; 程序架构的核心理念和需求 掌握回调函数的作用 掌握回调函数的程序编写 掌握回调函数在产品中的应用 1.程序架构 一个好的程序架构至少要达到以下要求: 硬件层和应用层的程序代码分开,相互之间的控制和通讯使用接口,而且不会共享的全局变量或者数组. 用专业术语描述就是可移植性.可扩展性. 在51单片机写程序时,基本上一个.c文件解决,包括寄存器配置,产品功能.到了stm32时,我们会把不同的

  • C语言中操作字符串的函数详解

    目录 一.函数表 二.strlen 实例 三.strcmp 实例 四.strcpy 实例 五.stract 实例 六.strchr 实例 总结 一.函数表 函数名 函数 功能 strlen size_t strlen(const char* s); 返回字符串 s 的长度(不包括结尾的0) strcmp int strcmp(const char* s1, const char* s2); 比较两个字符串,返回:如果 s1 == s2,返回 0:如果 s1<s2 则返回小于 0 (如 -1):如

  • C语言文件操作之fread函数详解

    目录 前言 一.fread 函数 二.缓冲区受限的情况 ( 循环读取文件 | feof 函数判定文件读取完毕 ) 三.处理乱码问题 四.记录读取的字节个数 五.读取到 0 字节的情况 六.读取完毕的情况 七.读取文本文件 “\n” 与 读取二进制文件 “\r\n” 区别 总结 前言 二进制文件读写两个重要的函数 , fread 和 fwrite , fread 用于读取文件 , fwrite 用于写出文件 ; fread / fwrite 函数 既可以操作 二进制文件 , 又可以操作 文本文件

  • C语言中的正则表达式使用示例详解

    正则表达式,又称正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE).正则表达式是使用单个字符串来描述.匹配一系列符合某个句法规则的字符串. 在c语言中,用regcomp.regexec.regfree 和regerror处理正则表达式.处理正则表达式分三步: 编译正则表达式,regcomp: 匹配正则表达式,regexec: 释放正则表达式,regfree. 函数原型 /* 函数说明:Regcomp将正则表达式字符串regex编译

  • Kotlin 语言中调用 JavaScript 方法实例详解

    Kotlin 语言中调用 JavaScript 方法实例详解 Kotlin 已被设计为能够与 Java 平台轻松互操作.它将 Java 类视为 Kotlin 类,并且 Java 也将 Kotlin 类视为 Java 类.但是,JavaScript 是一种动态类型语言,这意味着它不会在编译期检查类型.你可以通过动态类型在 Kotlin 中自由地与 JavaScript 交流,但是如果你想要 Kotlin 类型系统的全部威力 ,你可以为 JavaScript 库创建 Kotlin 头文件. 内联 J

  • jQuery3.0中的buildFragment私有函数详解

    时隔 3 个月,jQuery 团队终于发布了 3.0 Alpha 版本.有两个版本 jQuery compat 3.0 和 jQuery 3.0. jQuery compat 3.0 对应之前的 1.x, 兼容更多的浏览器,对于IE支持到 8.0 版本 jQuery 3.0 对应之前的 2.x,关注更新的浏览器,对于IE支持到 9.0 版本 此外, 3.0还增加了对 Yandex 浏览器的支持,一款来自俄罗斯的浏览器. 下面看下jQuery3.0中的buildFragment. 在 jQuery

  • Java语言中的内存泄露代码详解

    Java的一个重要特性就是通过垃圾收集器(GC)自动管理内存的回收,而不需要程序员自己来释放内存.理论上Java中所有不会再被利用的对象所占用的内存,都可以被GC回收,但是Java也存在内存泄露,但它的表现与C++不同. JAVA中的内存管理 要了解Java中的内存泄露,首先就得知道Java中的内存是如何管理的. 在Java程序中,我们通常使用new为对象分配内存,而这些内存空间都在堆(Heap)上. 下面看一个示例: public class Simple { public static vo

  • C语言中指针和数组试题详解分析

    目录 数组题: 程序一(一维数组): 字符数组 程序二(字符数组): 程序三(字符数组): 程序四(字符数组): 程序五(字符数组): 二维数组 程序六( 二维数组): 指针题 程序七( 指针): 程序八( 指针): 程序九( 指针): 程序十( 指针): 程序十( 图): 程序十一( 指针): 程序十二( 指针): 程序十三( 指针): 指针 和 数组 试题解析 小编,在这里想说一下,c语言的最后一节 C预处理,可能还需要一些时间,因为小编,昨天才下载了虚拟机 和 linux 系统,还没开始安

  • C语言中递归和排列组合详解

    目录 排列组合三大问题: 1.打印n个数的全排列 2.打印n个数中任意m个数的全排列 3.打印n个数中任意m个数的组合 完整代码如下: 总结 排列组合三大问题: 1.打印n个数的全排列2.打印n个数中任意m个数的全排列3.打印n个数中任意m个数的组合 1.打印n个数的全排列 这个题实际上是可以直接用STL中的next_permutation()函数,代码如下: #include<bits/stdc++.h> using namespace std; int main(){ int data[4

  • Go语言中的数据竞争模式详解

    目录 前言 Go在goroutine中通过引用来透明地捕获自由变量 切片会产生难以诊断的数据竞争 并发访问Go内置的.不安全的线程映射会导致频繁的数据竞争 Go开发人员常在pass-by-value时犯错并导致non-trivial的数据竞争 消息传递(通道)和共享内存的混合使用使代码变得复杂且易受数据竞争的影响 Add和Done方法的错误放置会导致数据竞争 并发运行测试会导致产品或测试代码中的数据竞争 小结 前言 本文主要基于在Uber的Go monorepo中发现的各种数据竞争模式,分析了其

  • Oracle中的游标和函数详解

     Oracle中的游标和函数详解 1.游标 游标是一种 PL/SQL 控制结构:可以对 SQL 语句的处理进行显示控制,便于对表的行数据 逐条进行处理. 游标并不是一个数据库对象,只是存留在内存中. 操作步骤: 声明游标    打开游标 取出结果,此时的结果取出的是一行数据 关闭游标 到底那种类型可以把一行的数据都装进来 此时使用 ROWTYPE 类型,此类型表示可以把一行的数据都装进来. 例如:查询雇员编号为 7369 的信息(肯定是一行信息). 例:查询雇员编号为 7369 的信息(肯定是一

随机推荐