字符串常识:
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语言】字符指针数组查找字符串相关推荐

  1. c语言中指针数组赋值字符串,C语言—用结构体指针给数组赋值(结构体指针指向字符串,给字符串赋值)...

    数组定义: char acBuf[sizeof(TRANS_HEAD_S) + sizeof(USER_HEAD_S) + 4] = {0}; 结构体定义: typedef struct { int ...

  2. 字符指针数组(二级指针)

    一.字符指针数组 - 1 1.字符指针数组概念 字符指针数组是指一个数组中的各个元素都是字符指针 或者是字符串(字符数组)的首地址 2.初始化 char *name[]={"zhangsan ...

  3. C语言字符型数组ppt,C语言第13讲指针与字符串(字符数组).ppt

    C语言第13讲指针与字符串(字符数组).ppt 6.2.3 指针与字符串(字符数组) C语言用字符数组存放字符串. 字符数组元素个数确定,一般用下标控制循环. 字符串有效字符个数由0确定,用结束符0控 ...

  4. C语言 —— 把字符指针中的字符串,存入字符数组中

    问题描述:有一个用字符指针表示的字符串char *str = "0 12";  有一个数组 char buf[128] = {0}; 现在需要将字符指针表示的字符串"0 ...

  5. c语言字符数组给字符指针,C语言常见有关问题之字符串数组和字符指针数组有关问题...

    C语言常见问题之字符串数组和字符指针数组问题 通过如下的实例来讲解这个问题: #include int main(void) { char a[3][4] = {"123", &q ...

  6. c语言二级字符指针运用(字符串)

    常用处理多条字符串的方法有:二维字符数组,字符指针数组,以及二级字符指针(后两者同时使用) 二级字符指针可以等于一个字符指针的地址,也可以被另外一个二级字符指针赋值. 例如: 定义*color[3]= ...

  7. c 将数字数组转成字符串_C+|用指针指向字符串字面量、字符数组及字符指针数组...

    指针可以指向一个字符串字面量,可以指向一个字符数组,可以指向一块动态分配的内存单元: char *s1, *s2, *s3 = "abcde"; char ch[] = " ...

  8. C语言 指针数组-字符指针数组整型指针数组 char*s[3] int*a[5] 数组指针int(*p)[4]

    基本介绍 1.指针数组:由n个指向整型元素的指针而组成,里面存放指针 Int *ptr[3]; 2.地址: ptr[i]:元素地址 &ptr[i]:指针地址 图示 代码: 内存布局: 代码 # ...

  9. C语言指针学习(6)指针数组-字符指针数组

    ** 一.指针数组(比较常见) ** 2.指针数组定义:数组中每个元素都是一个指针(地址) 每个元素只能是地址,不能是普通数据 3.定义指针数组的语法: 数据类型 *数组名[数组长度/元素个数]={地 ...

最新文章

  1. unity字符串换行符_Unity中Text中首行缩进两个字符和换行的代码
  2. Spark SQL Catalyst源代码分析之TreeNode Library
  3. 需求文档可以不签字吗? 之一
  4. 三年级小孩近视150度需要戴近视眼镜么?
  5. Spring框架中级联赋值(外部属性注入)以及内部属性注入
  6. 概率论与数理统计(陈希孺)学习笔记
  7. 数学顶级期刊- 数学纪事,数学年刊,数学进展,数学杂志
  8. _ZN10tensorflow8internal21CheckOpMessageBuilder9NewStringEv
  9. dell 服务器引导盘安装2003
  10. 使用iMazing给苹果手机设置专属来电铃声
  11. 若有恒 何必三更眠五更起 最无益 莫过一日曝十日寒
  12. 什么是linux系统管理指令,Linux必学的系统管理命令
  13. latex 学习使用记录(插图片,插表格,插公式,插参考文献)
  14. 计算机技术在生物教学中应用,电教技术在生物课堂教学中的运用
  15. 采用scp命令进行FTP数据迁移
  16. 人生的财富不只限于金钱
  17. w3af漏扫的基本使用
  18. SQL Server身份验证 登录失败解决方案
  19. 下载 编译 OBS 27.2 最新版本
  20. 地震波作用下单自由度体系的 Bouc-Wen-Baber-Noori滞回模型求解

热门文章

  1. 使用高德地图api点聚合案例 (自定义样式)
  2. 用友畅捷通升级时提示“T3账套采购或销售是优化流程,不支持升级处理”
  3. 【MATLAB】GNSS观测文件采样频率1Hz转换为10Hz
  4. ROBOGUIDE仿真教程
  5. 电子工程师必知必会——矢网史密斯Smith Chart圆图测试阻抗
  6. TP-LINK路由器自动拨号上网和无线上网设置
  7. 新浪微薄与腾讯微薄的第三方登录
  8. Vivado中的TCL脚本语言
  9. Spark设计理念和基本架构
  10. XPS可以转成Word吗?两种XPS转Word的方法