关于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赋值使用上的一些问题。。的更多相关文章

  1. c++ 踩坑大法好 char字符,char数组,char*

    1,基本语法 1,定义一个char字符: char hehe='a'; //单引号 2,定义一个由char字符组成的数组: char daqing[] = "abcd"; char ...

  2. unsigned char数组赋值

    memset(send_buf, 0, SEND_BUFF_LEN); const char * pStr = "this is test txt"; strcpy((char*) ...

  3. c语言结构体中的一个char数组怎么赋值?

    目录 前景提示 这里的结构体处理的步骤 一.char数组类型的处理 二.char数组指针类型的处理 三.全部代码 1. char数组 2. char数组指针 结语 前景提示 定义一个结构体,结构体中有 ...

  4. PChar,PAnsiChar,String,AnsiString,Char数组,AnsiChar数组转换

    PChar,PAnsiChar,String,AnsiString,Char数组,AnsiChar数组之间的转换关系见下图 通过转换链,可以实现任意两个类型之间的互转.如PChar转PAnsiChar ...

  5. Delphi中的各种字符串、String、PChar、Char数组

    参考博客:http://www.cnblogs.com/pchmonster/archive/2011/12/14/2287686.html 其中的所有代码均在Delphi7下测试通过. Delphi ...

  6. char数组与char指针

    1.以字符串形式出现的,编译器会在结尾自动添加\0,思考,为什么? 存在的C语言方法,如strlen(s),计算字符串的长度,其中s指针.strlen要计算字符串长度,必须知道哪里是结尾,因此使用\0 ...

  7. delphi char数组、string和Pchar的相互转换

    因为要调用windows的api或者给vc++写接口,很多地方都要用到pchar,现在将char数组.string和pchar之间的相互转换都列出来,都是网上找的资料,我总结一下,先直接上代码,再讲原 ...

  8. C++ char数组和string类简单使用总结

    使用char数组,进行字符串的操作,是c风格的操作方式. string是C++的风格,感觉string本质上就是一个vector<char> 以下代码详细展示了字符串的常见操作 #incl ...

  9. 字符串(一):char 数组

    字符串使用方法整理 系列: 字符串(一):char 数组 字符串(二):string 1. 声明 如下是一个例子(=> 表示表达式等价): char a[20] = "abcd&quo ...

随机推荐

  1. Redisson报错

    org.redisson.client.RedisResponseTimeoutException: Redis server response timeout (3000 ms) occured a ...

  2. 好客租房14-在jsx中使用javascript表达式的注意点

    注意点 单大括号中可以使用任意的表达式 jsx自身也是js表达式 注意:js中的对是一个例外 写在style样式中 //导入react     import React from "reac ...

  3. 121_Power Query之R.Execute的read.xlsx&ODBC

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.问题 pq在用 Excel.Workbook 读取一些Excel早期版本(.xls后缀)的文件时候,报错:DataFo ...

  4. Windows环境下启动Redis报错:Could not create server TCP listening socket 127.0.0.1:6379: bind: 操作成功完成。(已解决)

    问题描述: 今天在windows环境下启动Redis时启动失败报错: 解决方案: ①运行命令:redis-cli.exe ②退出Redis ③运行命令:redis-server.exe redis.w ...

  5. DOM标签操作与事件与jQuery查找标签

    目录 DOM之操作标签 创建标签对象 标签对象的属性 innerText与innerHTML 标签内部追加内容 属性操作 事件 常用事件 事件绑定 事件案例 jQuery简介 查找标签 基本选择器 属 ...

  6. 【ACM程序设计】动态规划 第二篇 LCS&LIS问题

    动态规划 P1439 [模板]最长公共子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 给出 1,2,-,n 的两个排列 P1 和 P2 ,求它们的最长公共子序列. ...

  7. 解决maven依赖冲突,这篇就够了!

    一.前言 什么是依赖冲突 依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成了包版本冲突. 依赖冲突的原因 我们在maven项目的pom中 一般会引用许许多多的dependency.例如 ...

  8. 记一次学习kibaba踩过的坑(Windows环境)

    下载地址 ElasticSearch:https://www.elastic.co/cn/downloads/elasticsearchLogstash:https://www.elastic.co/ ...

  9. 为什么 C# 访问 null 字段会抛异常?

    一:背景 1. 一个有趣的话题 最近在看 硬件异常 相关知识,发现一个有意思的空引用异常问题,拿出来和大家分享一下,为了方便讲述,先上一段有问题的代码. namespace ConsoleApp2 { ...

  10. .NET6接入Skywalking链路追踪完整流程

    一.Skywalking介绍 Skywalking是一款分布式链路追踪组件,什么是链路追踪? 随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务.互联网应用构建在不同的软 ...