2017-10-08 52 views
1
#include<stdio.h> 
#include<fcntl.h> 
int main(int argc, char *argv[]) 
{ 
    char buffer[6]; 
    int gotten; 
    printf("%s",argv[1]); 
    int fh = open(argv[1],O_RDONLY); 
    printf("File handle %d\n", fh); 
    while (gotten = read(fh, buffer, 6)) { 
     buffer[gotten] = '\0'; 
     printf("%s", buffer); 
    } 
    return 0; 
} 

这部分以文件为输入并打印文件的内容。我提供的文本文件包含“hello”。 buffer[gotten] = '\0';在这段代码中做了什么?什么是“buffer [gotten] =' 0';”在这个代码中呢?

+5

它增加了nul-terminator并可能导致缓冲区溢出 - 因为read可以返回6, –

回答

0

它添加一个空字符('\0')您在阅读该字符串的结尾。如果没有它,在打印的buffer值可能晃过"hello"末和潜在的打印乱码值。

0

'\ 0'字符被称为字符串终止符。这可以让字符串函数知道您传递给它的内存区域中的字符串已完成。这有助于避免在内存中阅读太多。

1

它确保有一个NULL字符终止C风格的字符串,使其安全使用与printfhttps://en.wikipedia.org/wiki/Null-terminated_string

在C++中有更好的类型,如std::string

Live On Coliru

#include <fcntl.h> 
#include <unistd.h> 
#include <cstdio> 
#include <array> 
#include <iostream> 

int main(int argc, char *argv[]) { 

    if (argc < 2) 
     return -1; 

    std::array<char, 6> buffer; 
    printf("%s\n", argv[1]); 

    int fh = open(argv[1], O_RDONLY); 

    printf("File handle %d\n", fh); 

    while (int gotten = read(fh, buffer.data(), buffer.size())) { 
     std::cout.write(buffer.data(), gotten); 
    } 
} 
0

空终止字符串。

'\0'是空终止字符。 gottenread()函数设置,该函数将返回读取的字符数,因此buffer[gotten]将成为数组中的下一个点(因为它基于0)。

null-termination允许C知道字符串何时结束。由于每次读取都重复使用缓冲区,因此不可能事先知道缓冲区中的内容,因此手动进行空终止是最佳选择。

0

中的字符串是char数组,其中字符串的最后一个字符是\0字符,用于标记字符串的末尾。由于从文件中读取字符不包括\0字符,因此需要手动添加,以便将其视为普通字符串。

0

在C,char字符串真的叫空终止字符串'\0'字符是“空终止符”(不要与空指针混淆)。

如果缺少这些,所有标准字符串函数将不起作用,因为它们将超出寻找范围的界限。

由于终止符,任何字符串例如至少需要6个字符的空格,以便能够匹配终结符。