[C]编译器对char数组声明的一个行为
如果使用char[]来声明char数组,那么编译器会自动计算后面的字面量字符数,再加上一个空字符,作为它的长度。实际上这个数组最后一位被编译器强行加上了\0:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h> #define BUFFSIZE 4096 int main(void)
{
int fd_1 = open("./test_1.txt", O_RDWR);
//为了改变fd_1的偏移值,输出一下fd_1的内容
char str[BUFFSIZE];
ssize_t n;
//往test_1.txt写入一些信息
char str_2[] = "|append";
n = write(fd_1, str_2, sizeof(str_2)); //最终的输出结果是"|append\0",在文本中,\0被当成了空格去显示
lseek(fd_1, , SEEK_SET);
while((n = read(fd_1, str, BUFFSIZE)) > ){
printf("%s\n", str);
}
}
给数组加上长度,就可以解决上述"问题":
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h> #define BUFFSIZE 4096 int main(void)
{
int fd_1 = open("./test_1.txt", O_RDWR);
//为了改变fd_1的偏移值,输出一下fd_1的内容
char str[BUFFSIZE];
ssize_t n;
//往test_1.txt写入一些信息
char str_2[] = "|append";
n = write(fd_1, str_2, sizeof(str_2)); //最终的输出结果是"|append"
lseek(fd_1, , SEEK_SET);
while((n = read(fd_1, str, BUFFSIZE)) > ){
printf("%s\n", str);
}
}
自行给未定义长度的字符串数组加\0的后果是sizeof计算字符长度的时候永远是字符个数+1,即导致"|append\0"会被计算为长度9:
#include <stdio.h> int main(void)
{
char str_2[] = "|append\0";
printf("%d\n", sizeof(str_2));//输出9
}
并且在写入文件的时候,写入\0会被当作空格键解析,所以代码1的示例如果改为自行添加\0,会导致写入文件的文本后面有两个空格:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h> #define BUFFSIZE 4096 int main(void)
{
int fd_1 = open("./test_1.txt", O_RDWR);
//为了改变fd_1的偏移值,输出一下fd_1的内容
char str[BUFFSIZE];
ssize_t n;
//往test_1.txt写入一些信息
char str_2[] = "|append\0";
n = write(fd_1, str_2, sizeof(str_2)); //最终的输出结果是"|append"
lseek(fd_1, , SEEK_SET);
while((n = read(fd_1, str, BUFFSIZE)) > ){
printf("%s\n", str);
}
}
[C]编译器对char数组声明的一个行为的更多相关文章
- c语言结构体中的一个char数组怎么赋值?
目录 前景提示 这里的结构体处理的步骤 一.char数组类型的处理 二.char数组指针类型的处理 三.全部代码 1. char数组 2. char数组指针 结语 前景提示 定义一个结构体,结构体中有 ...
- 字符串(一):char 数组
字符串使用方法整理 系列: 字符串(一):char 数组 字符串(二):string 1. 声明 如下是一个例子(=> 表示表达式等价): char a[20] = "abcd&quo ...
- c++ 踩坑大法好 char字符,char数组,char*
1,基本语法 1,定义一个char字符: char hehe='a'; //单引号 2,定义一个由char字符组成的数组: char daqing[] = "abcd"; char ...
- Java 数组声明与初始化
引言 学习了好久的java,每次要写数组的声明和初始化代码,总是理不清.最近又碰到了一次这种情况.这次拿出<Thinking In Java>好好总结一翻. 数组声明 对于数组的声明其实都 ...
- Delphi中的各种字符串、String、PChar、Char数组
参考博客:http://www.cnblogs.com/pchmonster/archive/2011/12/14/2287686.html 其中的所有代码均在Delphi7下测试通过. Delphi ...
- Java数组声明与拷贝的几种方式
Java数组声明的三种方式 第一种(声明并初始化): 数据类型[] 数组名={值,值,...}; 例:int[] a = {1,2,3,4,5,6,7,8}; ...
- 处理函数和数组声明[条款17]---《C++必知必会》
指向函数的指针声明和指向数组的指针声明容易混淆,原因在于函数和数组修饰符的优先级比指针修饰符的优先级高,因此通常需要使用圆括号. int *f1( );//一个返回值为 int* 的函数 int ( ...
- C++ char数组和string类简单使用总结
使用char数组,进行字符串的操作,是c风格的操作方式. string是C++的风格,感觉string本质上就是一个vector<char> 以下代码详细展示了字符串的常见操作 #incl ...
- php数组声明、遍历、数组全局变量使用小结
数组的本质:管理和操作一组变量,成批处理,下面为大家介绍下数组的分类.数组的分类及使用说明,感兴趣的朋友可以了解下哈 php教程:数组声明,遍历,数组全局变量 <? /* * 一.数组的概 ...
随机推荐
- Hadoop完全分布式集群搭建
Hadoop的运行模式 Hadoop一般有三种运行模式,分别是: 单机模式(Standalone Mode),默认情况下,Hadoop即处于该模式,使用本地文件系统,而不是分布式文件系统.,用于开发和 ...
- Docker (二) Windows10专业版安装教程
前言 本文将基于 windows10专业版 来安装docker 1.开启Hyper-V 温馨小提示:之前小编是windows10企业版没有Hyper-V这个功能,于是通过DockerToolbox安装 ...
- android studio 项目生成的apk变小的原因
问题:感觉直接在apk文件夹下面拷出来的apk不能安装使用,而且apk比较小,可能就是这个问题引起的 Android Studio版本升级到2.3后,增加了instant run功能,对项目的buil ...
- Vmare 无法打开内核设备“\\.\VMCIDev\VMX”: 系统找不到指定的文件。您在安装 VMware Workstation 后是否进行了重新引导?的解决办法
1.使用管理员省份运行cmd:net start vmx86(切记是要用管理员身份),启动服务成功问题即可解决. 2.若1操作中启动失败,则到Vmare安装目录下搜索vmx86.sys文件,并拷贝到C ...
- vue项目简单菜单排序
功能:拖拉后,数据重组,然后返回数组给后台处理 代码如下: <template> <el-dialog title="菜单排序" :close-on-click- ...
- Java生鲜电商平台-生鲜系统中商品订单系统售后系统设计
Java生鲜电商平台-生鲜系统中商品订单系统售后系统设计(服务订单履约系统) 说明: 电商之下,我们几乎能从电商平台上买到任何我们日常需要的商品,但是对于很多商品来说,用户购买发货后,只是整个交易流程 ...
- JS---DOM---为元素解绑事件
解绑事件 注意:用什么方式绑定事件, 就应该用对应的方式解绑事件 1.解绑事件 对象.on事件名字=事件处理函数--->绑定事件 对象.on事件名字=null; //1 对象.on事件名字= ...
- javaWeb实现验证码--代码超简单
1.前端显示 HTML: <h3>验证码:</h3> <input type="text" name="validationCode&quo ...
- 【原创】你的Redis怎么持久化的
引言 (本文改编自生活真实案例,如有类同,绝不是巧合!) 端午节,烟哥正在一边愉快的学习.... 突然,微信一阵抖动.原来是老刘呼唤烟哥!善良的烟哥本以为人家是要约我出去玩!然而,打开微信一看,出现下 ...
- Docker安全扫描工具之DockerScan
前言 本篇简单介绍Docker扫描工具DockerScan的安装使用.下述过程是在CentOS 7.6的虚拟机上进行的. [root@localhost ~]# cat /etc/redhat-rel ...