关于char[]数组通过scanf赋值使用上的一些问题。。
关于char[]数组通过scanf赋值使用上的一些问题。
假如我们有这么一段代码
#include <stdio.h>
int main(void){
char c1[2];
scanf("%s",c1);
char c2[20];
scanf("%s",c2);
printf("%s %s\n",c1,c2);
return 0;
}

char类型数组在栈区开辟了自己的空间。当我们输入数据
得出的结果是我们输入的数据,但是奇怪的是我们这里c1的长度限定为2为什么还是把输入的数据全部存储并且输出呢?因为它在内存空间中是连续存储的,我们在刚才使用的scanf的第二个参数中使用的是数组c1的首地址,在接收到一组数据时,它边按照连续的内存依次存储下去,且因为是字符数组,因此在后面追加一个空字符。在printf函数中的输出格式为%s,在读取c1的首地址上面指向变量的值的时候,遇到空字符则停止读取。所以我们刚刚即使输入了长度大于2的数据,我们仍然能读出相应的数据,但这种行为是未定义的,假如在后面的内存中有其他数据就会造成一些错误。
假如我们调换c1和c2数组的大小
#include <stdio.h>
int main(void){
char c1[20];
scanf("%s",c1);
char c2[2];
scanf("%s",c2);
printf("%s %s\n",c1,c2);
return 0;
}

为什么输出的结果与前面得出结论的不一样呢?同样的我们需要对存储的内存空间进行理解。我希望通过图示帮助大家理解。

c1数组的数据我们先存储在栈空间中,我们先是给c1中的字符变量赋值,后来的c2开辟的空间与c2的空间连续,再给c2赋值,值得注意的是这里因为存储的内存连续,所以在给c2赋值的时候,因为我们这里通过键盘输入的数据是大于c2数组所占空间大小的所以会把多余的数据存储在c1中,在printf语句中,printf("%s %s\n",c1,c2); c1数组里面的一些值此时已经被覆盖,所以输出c1的值就不会是我们第一步存储的数据abcd而是34。
关于char[]数组通过scanf赋值使用上的一些问题。。的更多相关文章
- c++ 踩坑大法好 char字符,char数组,char*
1,基本语法 1,定义一个char字符: char hehe='a'; //单引号 2,定义一个由char字符组成的数组: char daqing[] = "abcd"; char ...
- unsigned char数组赋值
memset(send_buf, 0, SEND_BUFF_LEN); const char * pStr = "this is test txt"; strcpy((char*) ...
- c语言结构体中的一个char数组怎么赋值?
目录 前景提示 这里的结构体处理的步骤 一.char数组类型的处理 二.char数组指针类型的处理 三.全部代码 1. char数组 2. char数组指针 结语 前景提示 定义一个结构体,结构体中有 ...
- PChar,PAnsiChar,String,AnsiString,Char数组,AnsiChar数组转换
PChar,PAnsiChar,String,AnsiString,Char数组,AnsiChar数组之间的转换关系见下图 通过转换链,可以实现任意两个类型之间的互转.如PChar转PAnsiChar ...
- Delphi中的各种字符串、String、PChar、Char数组
参考博客:http://www.cnblogs.com/pchmonster/archive/2011/12/14/2287686.html 其中的所有代码均在Delphi7下测试通过. Delphi ...
- char数组与char指针
1.以字符串形式出现的,编译器会在结尾自动添加\0,思考,为什么? 存在的C语言方法,如strlen(s),计算字符串的长度,其中s指针.strlen要计算字符串长度,必须知道哪里是结尾,因此使用\0 ...
- delphi char数组、string和Pchar的相互转换
因为要调用windows的api或者给vc++写接口,很多地方都要用到pchar,现在将char数组.string和pchar之间的相互转换都列出来,都是网上找的资料,我总结一下,先直接上代码,再讲原 ...
- C++ char数组和string类简单使用总结
使用char数组,进行字符串的操作,是c风格的操作方式. string是C++的风格,感觉string本质上就是一个vector<char> 以下代码详细展示了字符串的常见操作 #incl ...
- 字符串(一):char 数组
字符串使用方法整理 系列: 字符串(一):char 数组 字符串(二):string 1. 声明 如下是一个例子(=> 表示表达式等价): char a[20] = "abcd&quo ...
随机推荐
- Fuzzing101系列 Exercise 1 - Xpdf
序言 Fuzzing101系列包含针对10 个真实目标的10个练习,在练习中一步一步学习Fuzzing技术的知识. 模糊测试(Fuzzing/Fuzz)是一种自动化软件测试技术,它基于为程序提供随机或 ...
- HMS Core使能AI智慧体验,共建创新应用生态
5月17日,2022年搜狐科技峰会成功举办,峰会汇聚各界大咖,共同探讨AI 技术的深入应用以及行业数字化的发展趋势.华为终端云服务应用生态BU总裁望岳发表题为<使能AI智慧体验,共建创新应用生态 ...
- ESP8266远程控制电子门
ESP8266远程控制电子门 最前面介绍: 这是一个使用ESP8266 联网控制继电器,实现手机远程控制电子门,打开关闭,开关一次的物联网联手小项目 附git地址:https://github.com ...
- 关于JNPF3.4版本的三大改变,你真的了解了吗?
- 更换conda镜像源、pip镜像源
镜像源一般有两点特别需要注意,一个是Conda源,一个是Pip源: 更换Conda源,以更换清华Conda源为例: Anaconda 镜像使用帮助 Anaconda 是一个用于科学计算的 Python ...
- hibernate-validator的基本使用
validator是用来校验参数使用! 一般来说校验参数的工作可以放在前端去执行,但是假如有人不经过前端直接调用后端的接口呢?很可能就出现非法数据而导致一些问题,所有服务端也要做数据的校验. 前端校验 ...
- Java 多线程共享模型之管程(下)
共享模型之管程 wait.notify wait.notify 原理 Owner 线程发现条件不满足,调用 wait 方法,即可进入 WaitSet 变为 WAITING 状态 BLOCKED 和 W ...
- 代码调用Rally的接口介绍
1. 支持的语言 2. 创建APIKey 3. GetRequest 4. QueryRequest 5. CreateRequest 6. 参考资料 本文链接: https://www.cnblog ...
- 皓远的第一次博客作业(pta题目集——1-3)
题目集总结: 前言: 一. 知识点运用: ① Java入门的基础语法(循环,判断,字符串,数组等等),Java的基础类运用,类与对象关系调用,类间关系(聚合). ② 引(类与对象): 对象 ...
- java类的学习
什么是类: 类=属性+方法 属性来源于状态(以变量的形式存在):方法来源于动作: *属性对应的是数据,而数据只能存在变量中. 方法内的变量为局部变量:类体中的变量称为成员变量(也称为属性) java中 ...