【C语言】字符指针数组查找字符串
字符串常识:
1.以’\0’结尾,用" "括起来,字符是用’ ‘括起来
2.字符串有字符数组和字符指针两种表现形式。字符数组不一定是字符串,有’\0’结束的字符数组才是字符串,但字符串一定是字符数组
3.字符串常量是个地址常量,存放在文字常量区
char s1=“abc”; char s2=“abc”; /* 这里s1和s2都是指向内存的同一个地址单元,即s1==s2,这个地址单元存放了"abc"的起始地址 */
“abc”[0] == s1[0] == s2[0] == ‘a’
“abc”[1] == s1[1] == s2[1] == ‘b’
4.字符数组要看作用域和存储类型才能确定存放在内存的什么区域
5.处理字符串常用string.h里面的字符串函数
…
字符指针数组查找字符串:
1.遍历数组,比较字符串大小判断是否相等
int str_search1(const char*dststr, const char**srcstr, int num) //适用于全部字符串(字符数组和字符串常量)
{int i;for (i = 0; i < num; i++){if (strcmp(*srcstr++, dststr) == 0) //从头遍历字符串数组,找到相等的字符串返回 {return i;}//srcstr++;}return -1;
}
2.上述使用了strcmp函数比较字符串大小,增加了时间和空间上的消耗,若对象是字符串常量,可以直接比较地址值
int str_search2(const char*dststr, const char**srcstr, int num)//只适合字符串常量
{int i;for (i = 0; i < num; i++){if(*srcstr++==dststr) //从头遍历字符串数组,比较字符指针的值,利用字符串常量只有唯一的内存地址{return i;}//srcstr++;}return -1;
}
3.上述的方法简单可观,但是当数组较大时,不能快速判断字符串在不在数组里面,每次寻找字符串都要遍历一次数组,不适应多次查找字符串的场景。此时可牺牲一下空间资源换取时间资源,使用静态数组存储字符串的存在状态。
测试程序:
#include <stdio.h>
#include <string.h>const char* srcstr[] = { "Hello","我在那里!","我在哪里?","World","C语言","C++" };
const char* dststr = "我在哪里?"; //字符串常量int str_search1(const char*dststr, const char**srcstr, int num) //适用于全部字符串(字符数组和字符串常量)
{int i;for (i = 0; i < num; i++){if (strcmp(*srcstr++, dststr) == 0) //从头遍历字符串数组,找到相等的字符串返回 {return i;}//srcstr++;}return -1;
}int str_search2(const char*dststr, const char**srcstr, int num)//只适合字符串常量
{int i;for (i = 0; i < num; i++){if(*srcstr++==dststr) //从头遍历字符串数组,比较字符指针的值,利用字符串常量只有唯一的内存地址{return i;}//srcstr++;}return -1;
}int str_search3(const char*dststr, const char**srcstr, int num)//只适合字符串常量
{int i;static int a[4096]={0}; //数组大小随字符指针数组大小而变int start=(int)*srcstr; //将地址值转换为int型进行运算,防止溢出可以使用unsigned long long并进行取余操作int t=0;for (i = 0; i < num; i++){t=((start>(int)*srcstr)?(start-(int)*srcstr):((int)*srcstr-start));//将数组里面存在的字符串常量映射到数组上,并且保证数组下标t不小于0a[t]=1;srcstr++; }t=((start>(int)dststr)?(start-(int)dststr):((int)dststr-start)); if(a[t]!=0){return 0; //查找成功,但未定位字符串位置}else{return -1;}}int main()
{int ret;ret = str_search1(dststr, srcstr, sizeof(srcstr) / sizeof(char*));if (ret != -1){printf("查找成功\n");printf("\"%s\"在%d号位置\n",dststr,ret);}else{printf("查找失败,\"%s\"不在数组里\n",dststr);}getchar();return 0;
}
结果:
最后,当然方法还有很多,欢迎指点一下啦!大家共勉!
【C语言】字符指针数组查找字符串相关推荐
- c语言中指针数组赋值字符串,C语言—用结构体指针给数组赋值(结构体指针指向字符串,给字符串赋值)...
数组定义: char acBuf[sizeof(TRANS_HEAD_S) + sizeof(USER_HEAD_S) + 4] = {0}; 结构体定义: typedef struct { int ...
- 字符指针数组(二级指针)
一.字符指针数组 - 1 1.字符指针数组概念 字符指针数组是指一个数组中的各个元素都是字符指针 或者是字符串(字符数组)的首地址 2.初始化 char *name[]={"zhangsan ...
- C语言字符型数组ppt,C语言第13讲指针与字符串(字符数组).ppt
C语言第13讲指针与字符串(字符数组).ppt 6.2.3 指针与字符串(字符数组) C语言用字符数组存放字符串. 字符数组元素个数确定,一般用下标控制循环. 字符串有效字符个数由0确定,用结束符0控 ...
- C语言 —— 把字符指针中的字符串,存入字符数组中
问题描述:有一个用字符指针表示的字符串char *str = "0 12"; 有一个数组 char buf[128] = {0}; 现在需要将字符指针表示的字符串"0 ...
- c语言字符数组给字符指针,C语言常见有关问题之字符串数组和字符指针数组有关问题...
C语言常见问题之字符串数组和字符指针数组问题 通过如下的实例来讲解这个问题: #include int main(void) { char a[3][4] = {"123", &q ...
- c语言二级字符指针运用(字符串)
常用处理多条字符串的方法有:二维字符数组,字符指针数组,以及二级字符指针(后两者同时使用) 二级字符指针可以等于一个字符指针的地址,也可以被另外一个二级字符指针赋值. 例如: 定义*color[3]= ...
- c 将数字数组转成字符串_C+|用指针指向字符串字面量、字符数组及字符指针数组...
指针可以指向一个字符串字面量,可以指向一个字符数组,可以指向一块动态分配的内存单元: char *s1, *s2, *s3 = "abcde"; char ch[] = " ...
- C语言 指针数组-字符指针数组整型指针数组 char*s[3] int*a[5] 数组指针int(*p)[4]
基本介绍 1.指针数组:由n个指向整型元素的指针而组成,里面存放指针 Int *ptr[3]; 2.地址: ptr[i]:元素地址 &ptr[i]:指针地址 图示 代码: 内存布局: 代码 # ...
- C语言指针学习(6)指针数组-字符指针数组
** 一.指针数组(比较常见) ** 2.指针数组定义:数组中每个元素都是一个指针(地址) 每个元素只能是地址,不能是普通数据 3.定义指针数组的语法: 数据类型 *数组名[数组长度/元素个数]={地 ...
最新文章
- unity字符串换行符_Unity中Text中首行缩进两个字符和换行的代码
- Spark SQL Catalyst源代码分析之TreeNode Library
- 需求文档可以不签字吗? 之一
- 三年级小孩近视150度需要戴近视眼镜么?
- Spring框架中级联赋值(外部属性注入)以及内部属性注入
- 概率论与数理统计(陈希孺)学习笔记
- 数学顶级期刊- 数学纪事,数学年刊,数学进展,数学杂志
- _ZN10tensorflow8internal21CheckOpMessageBuilder9NewStringEv
- dell 服务器引导盘安装2003
- 使用iMazing给苹果手机设置专属来电铃声
- 若有恒 何必三更眠五更起 最无益 莫过一日曝十日寒
- 什么是linux系统管理指令,Linux必学的系统管理命令
- latex 学习使用记录(插图片,插表格,插公式,插参考文献)
- 计算机技术在生物教学中应用,电教技术在生物课堂教学中的运用
- 采用scp命令进行FTP数据迁移
- 人生的财富不只限于金钱
- w3af漏扫的基本使用
- SQL Server身份验证 登录失败解决方案
- 下载 编译 OBS 27.2 最新版本
- 地震波作用下单自由度体系的 Bouc-Wen-Baber-Noori滞回模型求解