2014-09-26 45 views
-2

我有一個大型的char數組,填充0。我從套接字讀入一個傳入文件並將其內容放入緩衝區。我無法寫入所有'\ 0'的緩衝區,所以我分配一個正確大小的新緩衝區並寫入。 我用這個方法來做到這一點:刪除尾部NULL終止符

int i = 0; 
while(buf[i] != '\0'){ 
    i++; 
} 
char new[i]; 
while(i){ 
    new[i] = buf[i]; 
    i--; 
} 
new[0] = buf[0]; 

雖然這種方法,它似乎並不像最聰明或最優雅的方式。從char數組中刪除所有尾隨空字符的最佳方法是什麼?

+1

你是什麼意思的「刪除」?所有的數組元素都有一個值。也許'realloc'是你需要的? – 2014-09-26 22:26:41

+3

我不認爲你完全明白這一點。你可以從你有的緩衝區寫入,你只需要知道它的有效長度。 – 2014-09-26 22:27:27

+0

我不是說刪除,而是創建一個不同長度的新緩衝區來保存文件。 – 2014-09-26 22:28:21

回答

1

我想更簡單的方式來做到這一點是:

size_t len = strlen(buf); // will calculate number of non-0 symbols before first 0 
char * newBuf = (char *)malloc(len); // allocate memory for new array, don't forget to free it later 
memcpy(newBuf, buf, len); // copy data from old buf to new one 
+0

是的,但爲什麼需要執行該操作? – spencer7593 2014-09-26 22:33:22

+0

@ spencer7593它是有意義的,如果原來的緩衝區進一步重新用於套接字操作 – 2014-09-26 22:35:00

+0

完美,我完全忘了strlen。 – 2014-09-26 22:41:00

0

您可以採取的NULL屬性的優勢。 只需複製不含空字符的此數據。像這樣 len = strlen(buf); //它將確保您只讀取total_char + 1 現在,只將len-1字符從此緩衝區複製到文件。如果你想要你也可以準備新的緩衝區。

1

我的第一個想法是:統計從您的流中收到的字符,然後將一定數量的字節寫入您的文件。

如果這是不可能的,我們得到的少聰明的做法:

int i = BUFFER_SIZE - 1; 
while((i>=0) && (buffer[i--] == '\0')); 
++i; 

之後,i包含你的緩衝區的長度。

+0

正如你寫的「我從套接字讀取傳入文件」 - 這可能是任意數據,strlen()將無法正常工作。請將來更精確。 – St0fF 2014-09-26 22:43:50