[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教程:数组声明,遍历,数组全局变量 <? /* * 一.数组的概 ...
随机推荐
- 史上最全的iptables应用
第14章 防火墙的使用 14.1 防火墙的概念 将不安全的网络流量信息进行隔离 14.2 防火墙的实现 14.2.1 硬件实现 思科,华为防火墙服务器 14.2.2 软件实现 iptables(cen ...
- Redis 使用消息隊列
關鍵函數 ListRightPush 生產消息 ListRightPop 消費消息 這是從右面增或取 左邊亦然
- iCamera App Kit 使用说明
一.概述 1.前言 iCamera是层层惊涛设计室推出的一款轻量级的摄像头开发调试工具,该工具可以用于市面上绝大多数摄像头的配置.调试.图像采集. iCamera主要作为摄像头开发调试工具,暂时不针对 ...
- 不启动AndroidStudio直接启动其模拟器
1.找到自己电脑Android sdk的安装路径下的tools\emulator.exe 2.获取你要启动的模拟器的名称 我这里是Nexus 5X API 27,把名字中间的空格改为_,我这里就应该改 ...
- Laravel 中使用 swoole 项目实战开发案例二 (后端主动分场景给界面推送消息)
推荐阅读:Laravel 中使用 swoole 项目实战开发案例一 (建立 swoole 和前端通信) 需求分析 我们假设有一个需求,我在后端点击按钮 1,首页弹出 “后端触发了按钮 1”.后端点了 ...
- [从今天开始修炼数据结构]图的最短路径 —— 迪杰斯特拉算法和弗洛伊德算法的详解与Java实现
在网图和非网图中,最短路径的含义不同.非网图中边上没有权值,所谓的最短路径,其实就是两顶点之间经过的边数最少的路径:而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,我们称路径上第 ...
- poj 3279 Fliptile (简单搜索)
Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16558 Accepted: 6056 Descrip ...
- 聊聊 Python 的内置电池
本文原创并首发于公众号[Python猫],未经授权,请勿转载. 原文地址:https://mp.weixin.qq.com/s/XzCqoCvcpFJt4A-E4WMqaA (一) 最近,我突然想到一 ...
- 【Java必修课】好用的Arrays.asList也有这三个坑
好用的asList 在开发或写测试用例的过程中,经常会用到Arrays.asList()这个方法,可以快速方便地将数组转化成一个List.例如: List<String> list = A ...
- day 28-1 元类
元类 元类的用途:自定义元类控制类的创建行为及类的实例化行为 Python 中一切皆为对象. 一切接对象,对象可以怎么用呢? 1.都可以被引用,x=obj 2.都可以当作函数的参数传入 3.都可以当作 ...