理解C语言编程中的空字符‘\0‘和换行符‘\n‘

前言:
  C语言的空字符是在字符串结尾处编译系统自动加上的‘\0’,以让计算机识别出一个字符串的结尾。所以要求在存储字符串时,至少要保留一个空间来存储‘\0’,其中,类似‘\0’这种形式的字符又被称为转义字符。

转义字符(Escape character),所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示。而C中定义了一些字母前加""来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。

  本文要说的‘\0’、‘\n’都是这类不能显示但是有很大用处的转义字符。

字符串存入数组并写入新文件

首先我用如下代码将一段字符串写入文件

int main() 
{
    
    
    //打开要写入的文件
    char arr[] = "012345678";
    FILE* wFile = fopen("demoput.txt","w");
    if(NULL == wFile)
    {
    
    
        printf("文件打开失败\n");
        return 0;
    }
    fputs(arr, wFile);
	printf("写入文件成功\n");
	printf("字符串长度:%d\n", strlen(arr));
    fclose(wFile);
    return 0;
}

  定义了hello字符串存到了arr数组中,然后将该数组中的字符串使用fputs(0函数写入到demoput.txt文件中,打印字符串长度,结果如下图所示:
在这里插入图片描述
在这里插入图片描述
  发现demoput.txt文件中只有一行,结果就是我们需要写入的字符串 “012345678” ,此时字符串长度为9。

单个字符存入数组并写入新文件

  修改上述代码,将以字符串存入“012345678”改为单个字符存入,代码如下:

int main() 
{
    
    
    //打开要写入的文件
    //char arr[] = "012345678";
    char arr[] = {
    
    '0', '1', '2', '3', '4', '5', '6', '7', '8'};
    FILE* wFile = fopen("demoput.txt","w");
    if(NULL == wFile)
    {
    
    
        printf("文件打开失败\n");
        return 0;
    }
    fputs(arr, wFile);
    printf("写入文件成功\n");
    printf("字符串长度:%d\n", strlen(arr));
    fclose(wFile);
    return 0;
}

运行结果如下:
在这里插入图片描述
在这里插入图片描述
  发现除了0123456789字符外,还打印了许多其他未知字符,此时字符串长度为15。那为什么会这样呢?
  主要因为当字符串作为一个整体时,C编译系统会自动在字符串末尾加’\0’作为结束标志,通过判断字符串’\0’的位置作为判断字符串结束的标志,strlen()函数也是通过判断’\0’的位置计算字符串的长度,但是不会把’\0’也算作字符串的长度。所以当以字符串形式存入数组并写入新文件时,能够成功写入“012345678”,并打印出字符串长度为9,当以单个字符的形式处理时,编译系统并不会在最后一个字符后面再添加’\0’,当使用fputs()函数写入和strtlen()函数计算长度时,本身数组中不存在’\0’结束标志,那么计算机就会寻找内存空间中最近的一个’\0’作为结束停止写入和计算长度,就会出现结果和预先存入的不匹配的情况,当内存空间被使用,最邻近的’\0’发现变化时,此时012345678字符后面的可能是任意长度的字符,直到最邻近的’\0’结束,字符串长度也是相应的长度。
  上述成立建立在数组空间满足存储字符串的要求才可以成功,那么如何是数组空间满足字符串要求呢?
  之前说C编译系统会在字符串的末尾自动添加’\0’字符,所以数组空间应至少比字符串的长度大一个字符,也就是字符串长度为9时,数组空间应该至少为10,其中第10个字符位置是用来存储’\0’字符的。

字符串存入数组多次写入新文件

  通过第一段程序我们知道在数组空间满足要求的情况下,可以通过fputs()函数向文本文件中写入一行数据,如下:
在这里插入图片描述
  我们在第一段代码的基础上再次写入该字符串,共计写入两次字符串,代码如下:

int main() 
{
    
    
    //打开要写入的文件
    char arr[] = "012345678";
    //char arr[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8'};
    FILE* wFile = fopen("demoput.txt","w");
    if(NULL == wFile)
    {
    
    
        printf("文件打开失败\n");
        return 0;
    }
    fputs(arr, wFile);
    fputs(arr, wFile);
    printf("写入文件成功\n");
    printf("字符串长度:%d\n", strlen(arr));
    fclose(wFile);
    return 0;
}

运行结果如下:
在这里插入图片描述
  我们发现是在第一次写完字符串的末尾继续写入该字符串,那么为什么没有在新的一行继续写入该字符串呢?
  因为该字符串的末尾我们并没有添加换行符’\n’,所以字符串没有在下一行继续写入。我们在字符串末尾后添加换行符’\n’继续看一看效果,代码如下:

int main() 
{
    
    
    //打开要写入的文件
    char arr[] = "012345678\n";
    //char arr[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8'};
    FILE* wFile = fopen("demoput.txt","w");
    if(NULL == wFile)
    {
    
    
        printf("文件打开失败\n");
        return 0;
    }
    fputs(arr, wFile);
    fputs(arr, wFile);
    printf("写入文件成功\n");
    printf("字符串长度:%d\n", strlen(arr));
    fclose(wFile);
    return 0;
}

运行结果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/ddb419e9de614c17b1de5acaf31f29c7.png在这里插入图片描述
  我们发现当写入一行字符串时,遇到字符串最后的换行符’\n’时,此时就会跳到下一行的位置,当我们继续写入字符串时,就会从下一行继续写入,实现换行写入的目的。此时字符串的长度为10,说明当我们向数组中存入字符串"012345678\n"后,编译系统自动在末尾添加了’\0’结束标志。

总结

  当使用C语言编程时,编译系统会在字符串的末尾自动添加’\0’结束符作为结束标志,它也是判断一个字符串结束的标志。
  换行符’\n’是实现数据写入文本实现换行的关键,在数据的末尾添加换行符’\n’后可以实现在写入数据的下一行继续写入。

猜你喜欢

转载自blog.csdn.net/zjrwinner/article/details/131984677
今日推荐