[C]编译器对char数组声明的一个行为
2024-09-01 23:12:39
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);
}
}
最新文章
- Bootstrap<;基础十四>; 按钮下拉菜单
- java后端书籍推荐
- day17算法
- 对.NET跨平台的随想
- Struts2:java.lang.NoSuchFieldException: resourceEntries at java.lang.Class.getDeclaredField(Class.java:1901)
- PL/SQL Developer使用技巧、快捷键
- 【HTML】Beginner2:page title
- Activiti 5.18 流程Model 转成 流程BPMN文件
- IOS网络请求中文转码
- 常用几种Java Web容器
- spring,hibernate配置事务
- springboot+mybatis+pagehelper
- Centos下配置php环境
- jenkins实战(二):构建自由风格的maven项目
- postgresql远程连接中断的处理
- CentOS-6.4 安装 PHP Memcached 扩展
- Python3.X如何下载安装urllib2包 ?
- Linux中的yum是什么?如何配置?如何使用?
- SSH 远程端口转发
- (转)Inno Setup入门(十一)——完成安装后执行某些程序
热门文章
- 通过ansible自动化部署zabbix应用
- [golang] nats的消息传递模型介绍
- js方法中参数传过来的值包含括号
- Java基础部分知识点(初稿)
- SpringCloud之Spring Cloud Stream:消息驱动
- 【MySQL】LIMIT以及LIMIT OFFSET
- Ubuntu18.04搭建测试环境
- 可编程实验板EPM1270T144C5使用说明
- Jmeter+Ant+Jenkins集成抛出异常java.lang.ClassNotFoundException: javax.mail.internet.MimeMessage
- 三个月前的评测拖延三个月仍旧是拳王No.1吗?YES!