2011-11-06 43 views
2

我是C新手,想要使用讀取功能。我想獲取緩衝區(tempChar)中的內容並將其放入另一個字符數組(str)中。這樣我就可以再次運行讀取函數並在以後添加到str中(因爲tempChar將被第二個讀取函數重寫)。就像這樣:讀取功能:將緩衝區複製到另一個字符數組

char tempChar; 
read(0, &tempChar, 10); 

char *str; 
str= (char*) malloc(10); 
memcpy(str, &tempChar, fileSize); /*I'm doing something wrong here*/ 

這一切都讓我可以重新運行:

read(0,&tempChar, 1); 
str= realloc(str, 11); 
str[10]=tempChar; 

它編譯罰款,但它給了我一個分段錯誤,當我其實嘗試運行它。

任何想法?謝謝一堆。

回答

1

你需要有足夠的存儲空間來存儲10個字符,你正在閱讀

你宣佈

char tempChar 

可容納1個字符。

相反聲明tempChar作爲

char tempChar[10]; 
1
char tempChar; 
read(0, &tempChar, 10); 

您正在從文件讀取10個字符到內存中只有一個字符的大小。
char tempChar只爲單個字符保留內存,& tempChar指向這個單個字節的內存。

char *str; 
str= (char*) malloc(10); 

// why not now do ? 
read(0, str, 10); 
1
char tempChar; 

只分配1個字節。所以你只能容納1個字符。當你memcpy()你請求複製10個不存在的字節。因此,你讀內存,你不應該導致未定義的行爲(這給你SegFault)。

您應該像使用malloc()一樣對str進行操作,或者聲明char chatTemp[10]這樣的本地數組。注:malloc()不C.

需要強制
0

你需要給一個文件描述符讀取功能的第一個參數。還需要如果你想分配char * buffer代替char tempChar; Check sample usage

+0

零是一個文件描述符:按照慣例,它是文件描述符底層'stdin'。 – zwol

0

讀兩次並將結果放在一起放在同一個緩衝區中,您不需要臨時緩衝區:您可以使用指針算術來指示read使用原始緩衝區的後半部分。像這樣:

char buf[10]; 
ssize_t nread = read(0, buf, 5); 
if (nread < 0) 
    error(); 
else 
{ 
    nread = read(0, buf + nread, sizeof buf - nread); 
    if (nread < 0) 
     error(); 
} 
相關問題