之前在自己练手写代码的时候总是会在字符串,字符这一块卡住,今天写下这篇文章给自己长长记性!

其实在代码过程中会遇到很多很玄学的问题。刚刚在尝试的时候找到了之前写的测试字符串的程序,放到另外一个工程里跑就没有问题,在原来的工程文件里跑就报错:(期间vs2019 升级了)如果有知道原因的大神还请帮忙解答一下疑惑。

在开始记录之前,我用的是vs2019的16.4.2,之前用的2019的某个版本以下这段代码是会乱码的

(是的,这么简单的代码都会有问题)

一般出现乱码都是因为字符编码出现问题,中国汉字的编码一般都是GBK开头的,而且中文属于宽字符(两个字节大小),一般abc和数字都是窄字符(一个字节大小),所以就有了wstring和wchar(感觉是专门为中文设计的),有关的资料可以去看看其他博客。我的环境之前会乱码,现在不会了。

接下来正式开始(然后再用代码加深记忆):

char:字符型基本类型,大小为1字节

string:是标准库中的一个类,既然是类就有很多函数可以通过点运算符来调用,比如常用的s.size()(返回串长) s.empty()(判断是否为空串)等等,还可以像数组一样索引他们,还可以用“+”来连接两个串。

#include<iostream>
using namespace std;int main() {char c = 'a'; //注意用单引号char c1 = '诶';  //如前面说的,中文字符有两个字节,而char只有一个字节,所以这里c1输不出cout << c<<endl;  cout << c1 << endl;//输出空,c1作为char不能接收一个中文字符string a1 = "是的";cout << a1 << endl;string a2 = "不是的";cout << a2[2] << endl; //输出空或者其他符号,并不会输出‘是’cout << a2[2] << a2[3] << endl;//输出‘是’cout << a1 + a2 << endl;//可以用加号把两个中文字符串连接string c3 = "123";string c4 = "456";cout << c3[2] << endl;//对于窄字符是可以直接像数组一样索引的cout << c3 + c4 << endl;cout << c3 + a1 << endl;//加号可以把两个串连接起来,不论中英文
} 

输出:

a是的是
是的不是的
3
123456
123是的

注意以上注释和空白输出。

char*和char[]:

当用户自己管理字符串的时候往往有两种方法:(不使用string时)

1.字符数组char[]:就是一个数组,但是存放的类型都是字符,如果是中文字符也可以,但是每个中文字符占用两个位置。

这里三个字符但是长度显示是7,这是因为每个中文字符占用两个位置,另外为了表示一个字符串的结束位置,最后一位是‘\0’。在程序处理中,检测到‘\0’就认为一个字符结束了。

2.字符指针管理串:也就是char* ,在实际应用中,字符串的长度变化很大,将字符串作为串地址,为管理字符串提供方便。

在直接为char*赋值时候可以采取如下形式:

const char* s = "你瞅啥";

系统上实际完成两步操作:首先申请堆空间,然后填入串值。至于这里为什么要用const,看后面代码的注释。

这里的代码尝试了常用的输入输出情况:(留意注释)

#include<iostream>
using namespace std;int main() {const char* s = "你瞅啥";//为什么要用const:含义是先新建一个字符串,内容是“你瞅啥” 然后str1是一个头指针,指向这个串. //但是这个新建串是作为const存在的,并不是一个可以编辑的变量,因此,一旦你想更改其中的值,程序就会挂掉.const char* s1 = "omg"; //去掉const会报错char s2[5] = "我c";//加上花括号也是可以的cout << s << endl; //直接将串全部输出cout <<*(s)<< *(s + 1) << endl;//类比string,由于这里是中文字符,所以这种操作是会输出第一个中文字符的cout << *(s1 + 1) << endl;//这里s1是英文字符,也就是说直接读出cout << s2 << endl;//也是直接输出s2cout << s2[2] << endl;//输出单个字符char* in=new char[20]; //在使用char* 但是未初始化的时候是需要先声明空间大小的,否则报错cout << "请输入in:";cin >> in;cout << in << endl;char in1[20];cout << "请输入in1:";cin >> in1;cout << in1 << endl;string str;cout << "请输入str:";  //这里这三种输入都直接输入就好,但是不能包含空格cin >> str;cout << str << endl;char* strc = &str[0]; //根据char*的本质,它是指向字符首个地址的,所以,//只要把str第一个字符的地址给char *,就可以完成整个字符串的拷贝。但是他只是指针,strc并不能真正保留str的初始内容//后面代码中只要再次修改str,strc也会随之改变cout << "请输入新的str:";cin >> str;cout << strc << endl;
}
你瞅啥
你
m
我c
c
请输入in:in
in
请输入in1:in1中文也可
in1中文也可
请输入str:666嘿嘿
666嘿嘿
请输入新的str:一起改变
一起改变

感觉总的来说输入输出都比较直观易懂,但是我总记得我之前给字符串赋值或者输出的时候的时候还要用到for循环。。。

但是我们有时候便于管理还是要用到char* name[],就是指针数组,放着很多个字符串在里头。

#include<iostream>
using namespace std;int main() {const char* str[3] = {"奥 利 给","这就是你分手的借口","干啥嘞"};//cout << "请给str赋值:";//cout << "赋值结束" << endl;cout << str<<endl; //输出地址cout << str[0]<<endl;//输出字符串,因为有中括号,这里表示数组内的元素cout << &(str[0])<<endl;char test[] = "wtf?";char* sp = test;cout << sp << endl;}

输出:

007DFD20
奥 利 给
007DFD20
007DFD24
wtf?

验证了一句话: 数组名字代表着这个数组的首地址,也是第一个元素的地址

在实际运用中,cstring这个库里面有一些我们常用的函数比如strlen(char* or char[])返回串长度,strcpy_s(des,src)复制串,但是这些就不在这次的讨论范围了。

综上,建议多用String。

(比较基础的东西,如果有错误还请指出)

C++中 char* 、string、 char、char[]在各种情况下的输入与输出相关推荐

  1. C++中const char*, string 与char*的转化

    C++中const char*, string 与char*的转化 原文:https://blog.csdn.net/zhang_alongzd/article/details/52790905 版权 ...

  2. 在Python中给定包含该项目的列表的情况下查找项目的索引

    对于列表["foo", "bar", "baz"]和列表"bar" ,如何在Python中获取其索引(1)? #1楼 a ...

  3. 如何在iOS 9中启用“应用程序传输安全性”的情况下加载HTTP URL? [重复]

    本文翻译自:How do I load an HTTP URL with App Transport Security enabled in iOS 9? [duplicate] This quest ...

  4. java 方法 throws_Java异常处理之------Java方法中throws Exception使用案例!什么情况下使用throws Exception?...

    @ava 中异常的处理 1.(终极解释!!!)throws Exception放在方法后边,是throws Exception表示的是本方法不处理异常,交给被调用处处理(如果你不希望异常层层往上抛,你 ...

  5. 请求过程中,需要证书认证,这种情况下如何处理

    某些站点请求时候,会需要证书,没有通过认证直接访问, 请求返回结果一般包含 code 443  和 cert,要如何处理 1.请求过程中,添加证书,但这种方式不那么方便或者友好,一般不这么处理 2.请 ...

  6. mysql workbench修改密码_在MySQL Workbench8.0中,忘记MySQL root密码的情况下修改密码...

    适用:如果你已经安装好MySQL,但因为忘记root密码且不想重新下载而无法建立连接,那么本文可能对你有用 前提:已经在环境变量中配置好mysql路径 步骤: Step1.准备配置文件 (1)查看根目 ...

  7. mysql workbench改密码_在MySQL Workbench8.0中,忘记MySQL root密码的情况下修改密码

    适用:如果你已经安装好MySQL,但因为忘记root密码且不想重新下载而无法建立连接,那么本文可能对你有用 前提:已经在环境变量中配置好mysql路径 步骤: Step1.准备配置文件 (1)查看根目 ...

  8. Matlab在光学中的应用举例 (一)(理想情况下的双缝干涉)

    理想情况下的双缝干涉(不考虑单缝衍射的调制作用)用Matlab画出其干涉图样,程序如下: x=-0.01:0.00003:0.01; y=-0.01:0.0003:0.01;    %设置屏上观察范围 ...

  9. C++中string、char[]、char*之间的转换

    目录 1.char[].char*转string 2.string转char*.char[] 1.char[].char*转string char[].插入*转string比较简单,直接赋值即可进行转 ...

最新文章

  1. C# 获取电脑的网络连接状态
  2. Oracle 内存一 手动内存管理,自动内存管理
  3. WinCE电源管理的简单介绍
  4. 通过python基于netconf协议获取网络中网元的配置数据,助力企业网络控制自动化轻松实现!
  5. centos ifconfig命令找不到_测试需要掌握docker的一些基本命令
  6. HTML5的音频播放和视频播放
  7. Jquery的基础学习
  8. 用Python编写单元测试:如何开始? [关闭]
  9. html textarea粘贴事件,javascript在textarea中捕获粘贴事件
  10. matlab连续投影算法SPA使用示例
  11. linux下protobuf-c的安装
  12. 【手写数字识别】基于matlab GUI BP神经网络手写数字识别系统【含Matlab源码 1639期】
  13. 基于java+SpringBoot+HTML+Mysq幼儿园日常管理系统
  14. 【CF633H】Fibonacci-ish II(权值线段树)(莫队)
  15. 如何解决 Elasticsearch 中未分配的分片
  16. Opcode指令解析
  17. 阿里云物联网是什么?
  18. 网页服务器修复,网页被劫持 网页被劫持后跳转发布网修复方法
  19. uniapp绘制分享海报
  20. 【问题解决】win10修改时间后一直闪屏

热门文章

  1. [iOS]上传图片和音视频到阿里云
  2. 工业网关需要具备的能力及分类
  3. 目前月薪存一百万需要多久?
  4. 速卖通自定义html模板,速卖通运费模版如何设置?
  5. 在连接里放<int:nid>获取参数 的nid值
  6. 常用于应届生面试的24道面试题
  7. 从计算机视觉角度深入解读了AR
  8. Yii2 中添加全局函数
  9. 【收藏】C#面试题整理笔试篇(最全1000+道带答案)300道填空 + 300道选择 + 300道判断 + 70道读程序写结果和看程序填空 + 100道简答题
  10. mysql匿名用户grant_mysql 建库报匿名用户权限错误