zoukankan      html  css  js  c++  java
  • [C]编译器对char数组声明的一个行为

    1概述

    如果使用char[]来声明char数组,那么编译器会自动计算后面的字面量字符数,再加上一个空字符,作为它的长度。实际上这个数组最后一位被编译器强行加上了:

    #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, 0, SEEK_SET);
        while((n = read(fd_1, str, BUFFSIZE)) > 0){
            printf("%s
    ", 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[7] = "|append";
        n = write(fd_1, str_2, sizeof(str_2));
        
        //最终的输出结果是"|append"
        lseek(fd_1, 0, SEEK_SET);
        while((n = read(fd_1, str, BUFFSIZE)) > 0){
            printf("%s
    ", str);
        }
    }

     自行给未定义长度的字符串数组加的后果是sizeof计算字符长度的时候永远是字符个数+1,即导致"|append"会被计算为长度9:

    #include <stdio.h>
    
    int main(void)
    {
        char str_2[] = "|append";
        printf("%d
    ", sizeof(str_2));//输出9
    }

    并且在写入文件的时候,写入会被当作空格键解析,所以代码1的示例如果改为自行添加,会导致写入文件的文本后面有两个空格:

    #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, 0, SEEK_SET);
        while((n = read(fd_1, str, BUFFSIZE)) > 0){
            printf("%s
    ", str);
        }
    }
  • 相关阅读:
    UVa 11988
    UVa 442
    .MySQL数据库技术
    Mysql数据库技术
    JDBC技术
    JDBC技术
    JavaSE编程基础
    JavaSE编程基础
    JavaSE编程基础
    web安全性测试
  • 原文地址:https://www.cnblogs.com/yiyide266/p/11615789.html
Copyright © 2011-2022 走看看