目录

1.查找字符串|判断包含关系

2.std::cerr与std::cout区别

3.字符串替换和条件替换

4.字符串比较的误区

5.将字符串的数字字符和其他字符分开存放

6.怎么拼接中间有0x00符的字符串(数组)


1.查找字符串|判断包含关系

string.find()与string::npos

查找字符串a是否包含子串b,不是用strA.find(strB) > 0 而是 strA.find(strB) != string:npos

if(strA.find(strB) == string::npos )//不存在。

if(strA.find(strB) != string::npos )//存在。

注意:

错误1:
int idx = str.find("abc");
if (idx == string::npos)
...
上述代码中,idx的类型被定义为int,这是错误的,即使定义为 unsigned int 也是错的,它必须定义为 string::size_type。
npos 是这样定义的:
static const size_type npos = -1;

因为 string::size_type (由字符串配置器 allocator 定义) 描述的是 size,故需为无符号整数型别。因为缺省配置器以型别 size_t 作为 size_type,于是 -1 被转换为无符号整数型别,npos 也就成了该型别的最大无符号值。不过实际数值还是取决于型别 size_type 的实际定义。不幸的是这些最大值都不相同。事实上,(unsigned long)-1 和 (unsigned short)-1 不同(前提是两者型别大小不同)。因此,比较式 idx == string::npos 中,如果 idx 的值为-1,由于 idx 和字符串string::npos 型别不同,比较结果可能得到 false。

错误2:if(str.find("abc") ) 
注:找不到abc会返回-1,不为0为True。0为False

通常来说,find函数用于寻找某个序列的在string中第一次出现的位置。

原文链接:https://blog.csdn.net/qq_33933704/article/details/79188028

2.std::cerr与std::cout区别

std::cerr(console error)是ISO C++标准错误输出流,对应于ISO C标准库的stderr。

cerr对应标准错误流,用于显示错误消息。默认情况下被关联到标准输出流,但它不被缓冲,也就说错误消息可以直接发送到显示器,而无需等到缓冲区或者新的换行符时,才被显示。一般情况下不被重定向。
例如下面代码编译后生成test.exe

// test.cpp
#include <iostream>
using namespace std;
int main()
{cout << "hello world---cout" << endl ;cerr << "hello world---cerr" << endl ;return 0;
}

为什么要用cerr

std::cerr 不用内存缓存信息,不怕因为极端情况下没有内存缓存而无法输出错误信息,耽误调试。

3.字符串替换和条件替换

替换 replace() 条件替换replace_if()

replace() 不仅可以替换字符,还可以替换值,算法会用新的值来替换和给定值相匹配的元素。

更多:std::string replace详解_Honei_X的博客-CSDN博客_std::replace

常见错误:

  1. no matching function for call to ‘replace(__gnu_cxx::__normal_iterator<char*,std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,__gnu_cxx::__normal_iterator<char*,const char [2],const char [1])

原因:c – std :: replace难度大 - 编程之家

4.字符串比较的误区

之前一直在写java,将java的字符串比较搞清楚后,写c++了,发现不适用了,还是存在很多细微差别,这里做个总结。

  1. 在比较两个字符串时不能利用符号“==”,如(“aaa”==“aaa”),“==”符号比较的是两个字符串的地址是否相等,切记!
  2. 若是比较两个字符,则可以用"=="直接进行比较
  3. 但比较两个string对象时是可以利用“==”的,相等的话,则表达式的返回值为1,不等为0。
  4. 如果用char数组来表示字符串,如char a[] = "aaa",b[]="aaa";,则a表示指向字符串的指针,所以a==b实际上还是地址的比较。
#include
#include
using namespace std;int main() {char a[] = "aaa",b[]="aaa";string A = "AAA", B = "AAA";cout <<"*a和*b的值分别是:" <<*a << "," << *b << endl;cout <<"*“aaa”的值是:"<< *"aaa" << endl;cout <<"利用 == 比较a,b两个字符串,结果是(相等为1,不等为0):" <<(a==b) << endl;cout << "利用strcmp()比较a,b两个字符串,结果是(相等为0,不等非0):"<<strcmp(a,b) << endl;cout << "利用 == 比较A,B两个string,结果是(相等为1,不等为0):"<<(A==B) << endl;cout << "利用compare()比较A,B两个string,结果是(相等为0,不等非0):" << A.compare(B) << endl;return 0;
}

结果为:

5.将字符串的数字字符和其他字符分开存放

C++编程 从键盘上输入一个字符串,将里面的数字字符转变成数值储存到数组中并输出

程序1:

#include <iostream>
#include <string>
using namespace std;
int main()
{
 char *ch=new char[];//定义一个动态char数组
 int *num=new int[];//定义一个动态int数组
 cout<<"请输入一串字符:"<<endl;
 cin>>ch;//输入字符串
 cout<<"这串字符串里数字有:"<<endl;
 int a=0;
 for(int i=0;i<strlen(ch);i++)
 {
  if(ch[i]>='0'&&ch[i]<='9')
  {
   num[a]=(int)ch[i]-48;//保存
   cout<<num[a]<<"  ";//输出
   a++;
  }
 }
 cout<<endl;
 return 0;
}

程序2:

#include<iostream>
using namespace std;

int main()
{
 char str[]="l34lab454ii876ui43";//自己定义的一个,也可以设置从键盘输入一个
 char *p=str;
 int i=0;//计算数字字符的个数
 int j=0;//控制循环输出和赋值
 while(*p)
 {
  if(*p>='0'&&*p<='9')
  {
   i++;
  }
  p++;
 }
 p=str;//刚才p跑到尾部了,重新指向str
 int *pArray=new int[i];//开辟一个有i个元素的整型数组,来存放数字字符
 while(*p)
 {
  if(*p>='0'&&*p<='9')
  {
   *(pArray+j)=*p-'0';//将数字字符减去'0'就是整数,赋值给刚才开辟的数组
   j++;
  }
  p++;
 }
 //输出
 for(j=0;j<i;j++)
 {
  cout<<*(pArray+j)<<" ";
 }
 cout<<endl;
 return 0;
}

6.怎么拼接中间有0x00符的字符串(数组)

2011-10-09 21:03:22

上面的怎么拼接中间有0x00符的字符串提法实际上是错误的,因为中间有0x00的不能算作字符串,字符串的结束符为0x00,且在最末尾。

可以通过memcpy函数实现。

void *memcpy(void *dest, const void *src, size_t n);

原以为这个函数只能复制,但是是可以拼接的,实际上面的void *dest参数正是将后面的数组存放的开始位置,所以我们通过指针的方式,使开始存放的位置后移,这样就不会覆盖掉前面的单元,就实现了拼接。

如:

char WirelessM[50]={0};  
  char Mac_To_Mac_Com_1[7]={0xFE};
  memcpy( WirelessM,Mac_To_Mac_Com_1,1);
  char Mac_To_Mac_Com_2[5]={0x01,0x11,0x01,0x00,0x02};
  memcpy( WirelessM+1,Mac_To_Mac_Com_2,5);
  char Mac_To_Mac_Com_3[3]={0x88,0x99,0xFA};
  memcpy( WirelessM+6,Mac_To_Mac_Com_3,3);

另:

作用:将s中第14个字符开始的4个连续字符复制到d中。(从0开始)

memcpy(d,s+14,4); //从第14个字符(V)开始复制,连续复制4个字符(View)

更多请看:http://topic.csdn.net/u/20110923/17/afb282a0-b035-4676-8749-7387faa4ff7e.html

百度:http://baike.baidu.com/view/736225.htm

【C/C++】字符串处理|字符串比较误区|挑出数字字符|npos--编辑中相关推荐

  1. 实验8.2 指针与字符串 7-2 字符串排序

    本题要求编写程序,读入5个字符串,按由小到大的顺序输出. 输入格式: 输入为由空格分隔的5个非空字符串,每个字符串不包括空格.制表符.换行符等空白字符,长度小于80. 输出格式: 按照以下格式输出排序 ...

  2. R语言使用str_locate函数和str_locate_all函数来定位特定字符串或者字符串模式在字符串中的位置:str_locate函数第一个位置、str_locate_all函数定位所有位置

    R语言使用str_locate函数和str_locate_all函数来定位特定字符串或者字符串模式在字符串中的位置:str_locate函数第一个位置.str_locate_all函数定位所有位置 目 ...

  3. R语言str_starts函数和str_ends函数检查在字符串的开头或者结尾是否存在特定字符串或者字符串模式

    R语言str_starts函数和str_ends函数检查在字符串的开头或者结尾是否存在特定字符串或者字符串模式 目录

  4. R语言使用str_split函数和str_split_fixed函数将字符串分割(分裂、split)成几个部分:str_split函数使用指定的字符或者字符串分割字符串、str_split_fixed

    R语言使用str_split函数和str_split_fixed函数将字符串分割(分裂.split)成几个部分:str_split函数使用指定的字符或者字符串分割字符串.str_split_fixed ...

  5. el replace 表达式_EL表达式截取字符串 各种字符串操作的方式全解 泽0715新浪博客...

    下面是JSTL中自带的方法列表以及其描述 函数名 函数说明 使用举例 fn:contains 判定字符串是否包含另外一个字符串 fn:containsIgnoreCase 判定字符串是否包含另外一个字 ...

  6. 同一个字符串hash值相同吗_图说:为什么Java中的字符串被定义为不可变的

    原文地址:https://dwz.cn/zWeX9Z7k 作者:Hollis 文章来源:微信公众号 字符串,想必大家最熟悉不过了,通常我们在代码中有几种方式可以创建字符串,比如:String s = ...

  7. java字符串拼接_为什么阿里巴巴不建议在for循环中使用quot;+quot;进行字符串拼接...

    点击上方"Java专栏",选择"置顶或者星标" 第一时间阅读精彩文章! ☞ 程序员进阶必备资源免费送「21种技术方向!」 点击查看☜ 字符串,是 Java 中最 ...

  8. python 字符串去重从小到大排列_python 序列(字符串、字符串、元组、集合、字典)...

    运行环境:python3.8 Anaconda 字符串 在python中,单个字符就是字符串. 字符串不可改变,使用单引号' ',双引号" ",三引号'" "' ...

  9. 【C 语言】字符串模型 ( 字符串翻转模型 | 借助 递归函数操作 逆序字符串操作 | 引入线程安全概念 )

    文章目录 一.引入线程安全概念 二.完整代码示例 一.引入线程安全概念 在上一篇博客 [C 语言]字符串模型 ( 字符串翻转模型 | 借助 递归函数操作 逆序字符串操作 | strncat 函数 ) ...

最新文章

  1. Python使用matplotlib可视化条形图(bar plot)、自定义在条形图的顶部添加数值标签(Bar Chart)
  2. XPath 详解,总结
  3. 思科系统公司以IP网络为中心的视频监视系统
  4. Python10分钟入门
  5. 51nod1127(尺取法)
  6. 实现DDD领域驱动设计: Part 1
  7. js 使用多态替换条件语句_用多态和组成替换多个条件
  8. Web设计师须知的10项SEO技巧
  9. 【华为云技术分享】GitHub联合开发
  10. 学习iot_腾讯 AI Lab智慧农业组招收多名算法工程实习生 -- IOT/机器学习方向
  11. Apache HttpServer的安装并与Tomcat整合Linux 版
  12. linux笔记_防止ddos攻击
  13. javac 与java_javac和参数用法java命令的-d -cp
  14. 图片压缩利器:TinyPNGWrapper
  15. Java Socket 编程学习(5) TCP UDP总结
  16. vue项目打包部署到tomcat服务器
  17. Html中所有的a标签点击打开新的窗口
  18. .Net 调用中国气象台Web Service
  19. javascript_video_2
  20. 钢琴网页制作教程_钢琴

热门文章

  1. 金山云跌13%,雷军赌败了,没想到却在其他领域中迎来了新转机
  2. 查询在线计算机名称和ip,局域网知道对方ip查看对方的计算机名和知道对方计算机名查看IP...
  3. 基于ROS的使用USB相机识别QR码
  4. 移远 EC200x/EC600x/EG912Y 4G 系列模组 AT 命令 MQTT 接入 ThingsCloud 云平台
  5. 怎样实现服务器端渲染?
  6. linux 安装yaf框架
  7. [每日一题] 0. 每日一题题解汇总
  8. 修改ToolBar的标题、子标题字体大小和颜色,toolbar menu字体的大小和颜色以及注意事项
  9. 稳定状态模型 (二):再生资源的管理和开发
  10. Linux内核之旅/张凯捷——系统调用分析(2)