1概述

如果使用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数组声明的一个行为的更多相关文章

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

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

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

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

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

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

  4. Java 数组声明与初始化

    引言 学习了好久的java,每次要写数组的声明和初始化代码,总是理不清.最近又碰到了一次这种情况.这次拿出<Thinking In Java>好好总结一翻. 数组声明 对于数组的声明其实都 ...

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

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

  6. Java数组声明与拷贝的几种方式

    Java数组声明的三种方式 第一种(声明并初始化):          数据类型[] 数组名={值,值,...};          例:int[] a = {1,2,3,4,5,6,7,8};    ...

  7. 处理函数和数组声明[条款17]---《C++必知必会》

    指向函数的指针声明和指向数组的指针声明容易混淆,原因在于函数和数组修饰符的优先级比指针修饰符的优先级高,因此通常需要使用圆括号. int *f1( );//一个返回值为 int* 的函数 int ( ...

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

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

  9. php数组声明、遍历、数组全局变量使用小结

    数组的本质:管理和操作一组变量,成批处理,下面为大家介绍下数组的分类.数组的分类及使用说明,感兴趣的朋友可以了解下哈   php教程:数组声明,遍历,数组全局变量  <? /* * 一.数组的概 ...

随机推荐

  1. FPGA_VIP_V101 视频开发板 深入调试小结

    FPGA_VIP_V101 推出已经有半年有余,各项功能例程已移植完毕,主要参考crazybingo例程进行移植和结合开发板设计了几个实例例程 主要包含: 硬件配置: FPGA:EP4CE6E22C8 ...

  2. Java基础篇

    #JAVA day01 基础篇 字节类型的使用方法 byte b1 = 126+1; byte b2 = 127+1;//因为127+1得出的结果是int类型,所以不能转换,编译出错 byte b3 ...

  3. ConcurrentHashMap比其他并发集合的安全效率要高一些?

    前言 我们知道,ConcurrentHashmap(1.8)这个并发集合框架是线程安全的,当你看到源码的get操作时,会发现get操作全程是没有加任何锁的,这也是这篇博文讨论的问题——为什么它不需要加 ...

  4. super()派生使用中的常见两个错误

    """ super()派生可以继承父类的属性 --super()派生继承父类的语法是:super().__init__() --super().__init__()中的_ ...

  5. 开源日志框架Exceptionless使用教程

    Exceptionless是一款日志记录框架,它开源.免费.提供管理界面.易于安装和使用.ExceptionLess底层采用ElasticSearch作为日志存储,提供了快速.丰富的查询API,方便我 ...

  6. ChinaSys 一些心得

    这周不要脸的和老板一起去了 ChinaSys,可以说整个中国搞系统最nb的一批人的学术交流了.一圈报告听下来, 有几点心得,不多,可能也没有那么深刻. 系统领域的开源框架并不多 搞系统和搞AI,搞算法 ...

  7. C#中提示:当前上下文中不存在名称“ConfigurationManager”

    场景 想要在程序中获取App.config中设置的内容. 想要通过 ConfigurationManager.AppSettings[key]; 来进行获取,已经添加 using System.Con ...

  8. 不加班的秘诀:如何通过AOE快速集成NCNN?

    作为我司头发储量前三的程序员 始终仗着头发多奋斗在加班的第一线 时时灵魂拷问自己 年轻人,你凭什么不加班? 虽然我没有女朋友但是,我有代码呀 但我不明白的是,隔壁工位那个,到岗比我迟,下班比我早,天天 ...

  9. UiPath Read CSV 中文乱码

    问题:UiPath 读取.CSV文件时,出现中文乱码. 解决1: 修改CSV文件的编码为UTF-8 解决2: 设置Read CSV Activity的 encoding属性为csv相应的编码格式 参考 ...

  10. DevOps工程师的成长路线图

    DevOps工程师的成长路线图 我们推崇的是 Reducing the gap between Devs and Operation teams. 来自kamranahmedse you built ...