2017-10-08 124 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個字符的空格,以便能夠匹配終結符。