2016-10-17 79 views
-1

嘿,我想對我對C語言使用的舊知識進行一些回顧。我想爲C字符串分配內存,然後寫入此緩衝區或從此緩衝區C字符串讀取。我記得在每個字符數組的末尾有'\ 0'來表示C字符串。C字符串分配

因此,總是將字符串分配爲(STRLEN + 1)並且在讀取或寫入(對文件,套接字等)時執行相同的操作是正確的。

char *myCString = malloc(sizeof(char)*(STRLEN+1)) 
read(fd, buff, STRLEN+1); 
write(fd, buff, STRLEN+1); 

感謝您澄清此問題。

+0

'\ 0'被稱爲NULL結束符,它表示字符串的結尾。 –

+0

答案或多或少是「是」。但是在這裏我們不知道什麼是'STRLEN'。它也取決於你的文件的格式。這個問題太廣泛了。 –

+0

是的,沒錯,以'C'結尾的字符數組被稱爲C中的字符串。此外,'sizeof(char)'總是1,所以這是毫無意義的。 'myCString'和'buff'不一樣,但也許這兩個不應該是相關的。 – unwind

回答

1

你或多或少正確。我對這個代碼

char *myCString = malloc(sizeof(char)*(STRLEN+1)) 

該筆記確實分配的STRLEN + 1個字節的緩衝(如果的sizeof(char)的是一個字節)。 STRLEN應該是您希望讀取的最大字節數。編譯器可能會抱怨,因爲malloc返回一個void *類型,並且將它存儲在char *中。向malloc調用添加(char *)類型轉換。

read(fd, buff, STRLEN+1); 

這將從文件句柄fd中讀取最大(STRLEN + 1)字節到名爲'buff'的緩衝區中。除了你已經調用緩衝區'myCString'的事實,這是好的。但是,此讀取不會在從文件讀取的字符末尾添加'\ 0',並且它不會在行尾停止。

如果您正在嘗試讀取和寫入行,那麼我建議您閱讀關於fopen/fclose/fprintf/fputs/fscanf/fgets的信息。這些是用於將字符串IO執行到文件的傳統C庫函數。

write(fd, buff, STRLEN+1); 

這會將(STRLEN + 1)字節寫入文件,而不管字符串長度在緩衝區中。例如,假設STRLEN = 7(所以你有一個8字符的緩衝區)。假設你在緩衝區中有'HELLO'這個詞。

存儲器將是:

0 1 2 3 4 5 6 7 
H E L L O \0 ?? ?? 

的??表示這個內存可能有任何值。

如果我'寫(fd,buf,8)',那麼它會將全部8個字節寫入文件。該文件將結束:

H E L L O \0 ?? ?? 

我希望你寧願有5個字節的文件(HELLO)

由於讀一個例子,假設你有2條線中有一個文件,用unix文件結尾。它可能看起來像:

H E L L O \n W O R L D \n 

(其中\ n =新行字符)

注意到有文件中沒有\ 0字符。 \ 0作爲緩衝區終結符是一個C事物,並且在文件中沒有模擬。

如果我沒有「讀(FD,BUF,8),那麼我的緩衝器將結束:

H E L L O \n W O 

8個字符被讀取,並且該字符串沒有 '\ 0' 就結束。如果我試圖打印它,那麼我會失敗,因爲沒有\ 0。

正確的函數是fgets和fputs,它們會讀取和寫入字符串,並考慮到\ n。