盘点分析C语言中少见却强大的字符串函数

目录
  • 正片开始
    • 字符串函数
      • strcpy
      • strcat
      • strcmp
      • strstr
      • strtok
      • strerror

正片开始

字符串函数

首先神魔是字符串函数?

指的是编程语言中用来进行字符串处理的函数,如C,pascal,Visual以及LotusScript中进行字符串拷贝,计算长度,字符查找等的函数。 功能:把src所指由NUL结束的字符串复制到dest所指的 数组 中。 返回指向dest结尾处字符 (NUL)的 指针 。

像之前我写到过的 strcpy,strcat,strcmp 这些函数都属于长度不受限的字符串函数,由此就有下面两种分类

1.长度不受限的字符串函数

2.长度受限的字符串函数

长度不受限就是以‘ \0 ’为函数结束标准的判定,当对象没给定 ’ \0 '时,就跑不出结果或者报错;相反则为长度受限。我再整理一下,好做个对比:

strcpy

字符串拷贝,把指向的字符串复制到目标字符串,声明为

char *strcpy(char *dest, const char *src)

strcat

字符串连续,把指向的字符串追加到目标字符串的结尾(无间隔),声明为:

char *strcat(char *dest, const char *src)

strcmp

把所指向的字符串和目标字符串进行比较, 返回值大小决定二者的相对大小,声明如下:

int strcmp(const char *str1, const char *str2)

以上三种是函数的长度受限,我们可以变 strncpy,strncat 和 strncmp,就是长度不受限函数了,相比多了一个 n ,这个 n 是指函数作用范围最多在前 n 个字节,比如 strncmp 中的n 就是要比较的最大字符数,就相当于一个限制机制了。

这里主要补充几个比较实用的吧:

strstr

其实顾名思义,翻译过来就是“字符串字符串”,其实作用就是在一个字符串里面找我的目标字符串,不包含终止符 ‘\0’,返回值是该函数在 目标字符串中第一次出现该字符串的位置。声明为:

char *strstr(const char *haystack, const char *needle)

举个栗子:

int main()
{
	char a[] = "overwatch";
	char b[] = "wa";
	char* c = strstr(a, b);
	if (c != NULL)
	{
		printf("found it: %s\n", c);
	}
	else
	{
		printf("there was nothing\n");
	}
	return 0;
}

我们用最常规的代码也可以模拟出 strstr 的功能,库函数的实现方法也是类似

#include<assert.h>
char* strstr1(const char* a, const char* b)
{
	assert(a && b);
	const char* c = NULL;
	const char* d = NULL;
	const char* str = a;
	if (*b == '\0')
	{
		return (char*)a; //处理查找语句为空语句
	}
	while (*str)
	{
		c = str;
		d = b;
		while (*c && *d && (*c == *d))//防止相同元素为'\0' 循环继续导致越界访问
		{
			*c++;
			*d++;
		}
		if (*d == '\0')
		{
			return (char*)str;
		}
		str++;//多次查找,匹配错误会回到起点++再重新查找
	}
	return NULL;
}

要注意的是,该函数规定当查找对象字符串为空 (\0) 时,会返回目标字符串的地址。

KMP算法

说到了 strstr ,引申一下KMP算法,也就是字符串查找算法,称之为 Knuth-Morria-Pratt 算法。该算法相对于暴力算法有比较大的改进,主要是消除了主串指针的回溯,从而使算法效率有了某种程度的提高。KMP算法比我们的 strstr 效率要高,我们日后再细细讲解

strtok

我们可以称之为字符串刀,作用就是分割字符串,strtok() 函数的声明如下:

char *strtok(char *str, const char *delim)

str 为一组字符串,delim 为分隔符,也可以是个集合,分割结果变成第一个子字符串。

因为结果被修改所以 strtok 对象一般为临时拷贝的可修改内容。举个栗子:

int main()
{
	char a[] = "overwatch";
	char b[20] = { 0 };
	char* ret = NULL;
	strcpy(b, a); //进行临时拷贝方便切割
	char* p = "w";//指针类型维护分隔符
	ret = strtok(b, p);
	printf("%s\n", ret);
	return 0;
}

若要进一步分割,我们需要空指针进行维护,什么意思?
分割完一次,结尾就会变成 ‘ \0 ’,此时的 strtok 记忆能力已经记住了 ‘ \0 ’的位置,这个记忆功能我们大致都能猜出是一个静态变量,static 修饰一个局部变量时就可以做到这点,就是我们只需要传入一个 null ,就可以自动进行分割,以此类推:

	strtok(b, p);
	ret = strtok(NULL,"t");

strerror

咱在使用库函数时,总会有调用失败的时候,这时候都会有一个错误码被设置,这个错码都会放进 errno 这个全局错误码里面,我们看到的错误信息可能是一个莫名其妙的数字,而 strerror 就是将错误码翻译成错误信息,并返回一个指向错误消息字符串的指针。strerror 生成的错误字符串取决于开发平台和编译器。

char *strerror(int errnum)

比如:

int main()
{
	printf("%s\n", strerror(10));
	printf("%s\n", strerror(20));
	printf("%s\n", strerror(30));
	return 0;
}

结果分别是:无子进程,非目录元素,只读文件系统

但其实 strerror 并不是小题大做拿来查询错误的,是在文本上输入输出时方便我们得知打开写入打开失败的原因的,当我们尝试打开一个不存在的文件时就会报错: No such file or directory

#include <errno.h>
int main ()
{
   FILE *fp;  fp = fopen("file.txt","search");
   if( fp == NULL )
   {
      printf("Error: %s\n", strerror(errno));
   }
  return(0);
}

因为我们要调用C语言给出的全局变量 errno,所以记得要引 <errno.h> 头文件。

以上就是盘点分析C语言中少见却强大的字符串函数的详细内容,更多关于C语言字符串函数的资料请关注我们其它相关文章!

(0)

相关推荐

  • c语言中字符串分割函数及实现方法

    1.问题引入 自己在写一个linux下的模拟执行指令的时候,遇到了输入"cat a.c",要将该字符串分解成cat和a.c两个单独的字符串,虽然知道有strtok的存在,但是想自己尝试写一下,于是就自己写了一个,不过总是遇到这样或那样的问题,虽然最后调通了,不过确浪费了不少时间:后来作业交上去以后又仔细阅读了strtok函数,发现原来linux下已经改成strsep,所有在这里就写一下自己所走的过程. 2.自己写的字符串分割函数:用于分割指令,比如cat a.c最后会被分割成cat和a

  • 超详细的c语言字符串操作函数教程

    目录 一,常量指针与指针常量 二,字符串长度问题 三,c语言中的字符串拷贝函数 1) strcpy() 2), strncpy() 3), strcat() 4), strncat() 5), strcmp() 6), strncmp() 7), sprintf() 8) sscanf() 9) strchr() 10), strstr() 11) strtok() 总结 我们知道,c/c++之所以使用起来灵活,很大原因归因于它能够它对能够对内存的直接操作,所以本文我主要讲述一下c中的字符串操作

  • C语言中“不受限制”的字符串函数总结

    "不受限制的"字符串函数 按<C和指针>中所说,那些常用的字符串函数都是"不是限制的",就是说它们只能通过寻找字符串末尾的NULL来判断字符串的长度. strlen strlen函数用于求解字符串长度,其返回类型为unsigned int(即size_t).strlen函数从起点开始,往后计数,遇到'\0'停止. 值得注意的是:strlen函数的返回类型.看如下代码: #include<string.h> #include<iostre

  • C语言字符函数与字符串函数详解

    目录 本章重点 前言 1.strlen函数 注意点1 注意点2 2.strcpy 注意点1: 注意点2: 注意点3: 注意点4: 总结 本章重点 重点介绍处理字符和字符串的库函数的使用和注意事项 1.求字符串长度 strlen 2.长度不受限制的字符串函数 strcpy ,strcat, strcmp 3.长度受限制的字符串函数 strncpy,strncat ,strncmp 4.字符串查找 strstr,strtok 5.错误信息报告 strerror 6.字符操作 7.内存操作函数 mem

  • 带你用C语言实现strtok和字符串分割函数

    目录 前言 一.strtok的基本使用 二.strtok的实现 总结 前言 字符串分割函数strtok,大家可能都知道他怎么使用,一旦要用的时候就会心生疑惑,不知道它的内部的实现,废话不多说,本篇就来带大家看看strtok的基本使用和实现 一.strtok的基本使用 解析:函数大概说了以下几点 1.str就是我们要去拆分的字符串,注意,我们会对该字符串进行更改,所以一般我们会拷贝一份然后去分割拷贝的那份字符串!! 2.delimiters 就是我们定义的切分的符号,假如想要用空格作为分割符,我们

  • 盘点分析C语言中少见却强大的字符串函数

    目录 正片开始 字符串函数 strcpy strcat strcmp strstr strtok strerror 正片开始 字符串函数 首先神魔是字符串函数? 指的是编程语言中用来进行字符串处理的函数,如C,pascal,Visual以及LotusScript中进行字符串拷贝,计算长度,字符查找等的函数. 功能:把src所指由NUL结束的字符串复制到dest所指的 数组 中. 返回指向dest结尾处字符 (NUL)的 指针 . 像之前我写到过的 strcpy,strcat,strcmp 这些函

  • 详解c语言中的 strcpy和strncpy字符串函数使用

    strcpy 和strcnpy函数--字符串复制函数. 1.strcpy函数 函数原型:char *strcpy(char *dst,char const *src)            必须保证dst字符的空间足以保存src字符,否则多余的字符仍然被复制,覆盖原先存储在数组后面的内存空间的数值,strcpy无法判断这个问题因为他无法判断字符数组的长度. #include <stdio.h> #include<string.h> int main() { char message

  • C语言中时间戳转换成时间字符串的方法

    在PE格式里有个字段是文件的创建时间戳,我想把转成字符串,这样看的更直观. TCHAR buffer[50] = {0}; struct tm Tm = {0}; time_t time = (time_t)NtHeader->FileHeader.TimeDateStamp;//时间戳 gmtime_s(&Tm, &time); printf(buffer, TEXT("%d年%d月%d日 %d:%d:%d"), Tm.tm_year+1900, Tm.tm_m

  • Lua中的string库(字符串函数库)总结

    Lua解释器对字符串的支持很有限.一个程序可以创建字符串并连接字符串,但不能截取子串,检查字符串的大小,检测字符串的内容.在Lua中操纵字符串的功能基本来自于string库. 字符串库中的一些函数是非常简单的: string.len(s)          返回字符串s的长度: string.rep(s, n)      返回重复n次字符串s的串:你使用string.rep("a", 2^20)可以创建一个1M bytes的字符串(比如,为了测试需要): string.lower(s)

  • 简单分析C语言中指针数组与数组指针的区别

    首先来分别看一下,指针数组的一个小例子: #include <stdio.h> #include <string.h> int lookup_keyword(const char*key, const char* table[], const int size) { int ret = -1; int i = 0; for(i=0; i<size; i++) { if (strcmp(key, table[i]) == 0) { ret = i; break; } } ret

  • C语言中操作密码文件的一些函数总结

    C语言setpwent()函数:从头读取密码文件中的账号数据 头文件: #include <pwd.h> #include <sys/types.h> 定义函数: void setpwent(void); 函数说明:setpwent()用来将getpwent()的读写地址指回密码文件开头. 范例 #include <pwd.h> #include <sys/types.h> main() { struct passwd *user; int i; for(i

  • 仿写C语言string.h头文件检验字符串函数

    目录 c语言string.h头文件字符串检验函数仿写 strlen字符串求长度 strcmp / strncmp字符串比较 strchr / strrchr 字符串中查找字符ch 第一个出现的字符ch 最后一个出现的字符ch strstr 字符串匹配:src_str中查找des_str,返回匹配的起始位置,没有为NULL(BF算法) strcpy / strncpy字符串拷贝 strcat / strncat字符串的粘贴 strdup 字符串申请堆区空间存放字符串的副本 总结 c语言string

  • Go语言中的函数详解

    1.函数的声明定义 //func关键字 //getStudent函数名 //(id int, classId int) 参数列表 //(name string,age int) 返回值列表 func getStudent(id int, classId int)(name string,age int) { //函数体 if id==1&&classId==1{ name = "BigOrange" age = 26 } //返回值 return name, age /

  • C语言中字符串的存储方法

    众所周知,C语言中没有数据类型能够存储字符串,char数据类型仅仅能够存储一个字符的数据,那么在C语言中关于存储字符串这一难题我们改何去何从呢? 下面将详述相关的字符串存储方法; 1.使用字符数组存; [root@Qrui ruiy]# #include<stdio.h> int main(int argc,const char *argv[],const char **env[]) { char name[] = "qinrui";//定义一个字符数组,并初始化; cha

  • 一文了解Go语言中的函数与方法的用法

    目录 函数定义语法 函数定义示例 无返回值函数 单一返回值函数 多返回值函数 方法(Method)定义 方法(Method)示例 基本类型 结构体类型 函数定义语法 与大部分语言一致,Go语言中的函数定义与其他语言基本一致 func function_name(Parameter-list) { // function body... } func function_name(Parameter-list) Return-Type { // function body... } func fun

随机推荐