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. 史上最全的iptables应用

    第14章 防火墙的使用 14.1 防火墙的概念 将不安全的网络流量信息进行隔离 14.2 防火墙的实现 14.2.1 硬件实现 思科,华为防火墙服务器 14.2.2 软件实现 iptables(cen ...

  2. Redis 使用消息隊列

    關鍵函數 ListRightPush  生產消息 ListRightPop   消費消息 這是從右面增或取 左邊亦然

  3. iCamera App Kit 使用说明

    一.概述 1.前言 iCamera是层层惊涛设计室推出的一款轻量级的摄像头开发调试工具,该工具可以用于市面上绝大多数摄像头的配置.调试.图像采集. iCamera主要作为摄像头开发调试工具,暂时不针对 ...

  4. 不启动AndroidStudio直接启动其模拟器

    1.找到自己电脑Android sdk的安装路径下的tools\emulator.exe 2.获取你要启动的模拟器的名称 我这里是Nexus 5X API 27,把名字中间的空格改为_,我这里就应该改 ...

  5. Laravel 中使用 swoole 项目实战开发案例二 (后端主动分场景给界面推送消息)

    推荐阅读:Laravel 中使用 swoole 项目实战开发案例一 (建立 swoole 和前端通信)​ 需求分析 我们假设有一个需求,我在后端点击按钮 1,首页弹出 “后端触发了按钮 1”.后端点了 ...

  6. [从今天开始修炼数据结构]图的最短路径 —— 迪杰斯特拉算法和弗洛伊德算法的详解与Java实现

    在网图和非网图中,最短路径的含义不同.非网图中边上没有权值,所谓的最短路径,其实就是两顶点之间经过的边数最少的路径:而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,我们称路径上第 ...

  7. poj 3279 Fliptile (简单搜索)

    Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16558   Accepted: 6056 Descrip ...

  8. 聊聊 Python 的内置电池

    本文原创并首发于公众号[Python猫],未经授权,请勿转载. 原文地址:https://mp.weixin.qq.com/s/XzCqoCvcpFJt4A-E4WMqaA (一) 最近,我突然想到一 ...

  9. 【Java必修课】好用的Arrays.asList也有这三个坑

    好用的asList 在开发或写测试用例的过程中,经常会用到Arrays.asList()这个方法,可以快速方便地将数组转化成一个List.例如: List<String> list = A ...

  10. day 28-1 元类

    元类 元类的用途:自定义元类控制类的创建行为及类的实例化行为 Python 中一切皆为对象. 一切接对象,对象可以怎么用呢? 1.都可以被引用,x=obj 2.都可以当作函数的参数传入 3.都可以当作 ...