4 回答

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超6個(gè)贊
有點(diǎn)丑陋的方式:
char *pos;if ((pos=strchr(Name, '\n')) != NULL) *pos = '\0';else /* input too long for buffer, flag error */
有點(diǎn)奇怪的方式:
strtok(Name, "\n");
請(qǐng)注意,strtok
如果用戶(hù)輸入空字符串(即僅按Enter),則該功能無(wú)法按預(yù)期工作。它使\n
角色完好無(wú)損。
當(dāng)然還有其他一些。

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
也許最簡(jiǎn)單的解決方案使用我最喜歡的一個(gè)鮮為人知的功能strcspn()
:
buffer[strcspn(buffer, "\n")] = 0;
如果你想要它也處理'\r'
(比如,如果流是二進(jìn)制):
buffer[strcspn(buffer, "\r\n")] = 0; // works for LF, CR, CRLF, LFCR, ...
該函數(shù)計(jì)算字符數(shù),直到它擊中a '\r'
或a '\n'
(換句話(huà)說(shuō),它找到第一個(gè)'\r'
或者'\n'
)。如果沒(méi)有碰到任何東西,它會(huì)停在'\0'
(返回字符串的長(zhǎng)度)。
請(qǐng)注意,即使沒(méi)有換行,這也可以正常工作,因?yàn)?code>strcspn在a處停止'\0'
。在這種情況下,整條生產(chǎn)線(xiàn)只是替換'\0'
為'\0'
。

TA貢獻(xiàn)1809條經(jīng)驗(yàn) 獲得超8個(gè)贊
size_t ln = strlen(name) - 1;if (*name && name[ln] == '\n') name[ln] = '\0';

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超9個(gè)贊
以下是'\n'
從保存的字符串中刪除潛在的快速方法fgets()
。
它使用strlen()
2次測(cè)試。
char buffer[100];if (fgets(buffer, sizeof buffer, stdin) != NULL) { size_t len = strlen(buffer); if (len > 0 && buffer[len-1] == '\n') { buffer[--len] = '\0'; }
現(xiàn)在使用buffer
并len
根據(jù)需要。
此方法具有len
后續(xù)代碼值的附帶好處。它可以比它快得多strchr(Name, '\n')
。 參考 YMMV,但兩種方法都有效。
buffer
,從原來(lái)fgets()
不會(huì)包含在"\n"
某些情況下:
A)線(xiàn)太長(zhǎng),buffer
所以只有char
在'\n'
保存之前buffer
。未讀的字符仍保留在流中。
B)文件中的最后一行沒(méi)有以a結(jié)尾'\n'
。
如果輸入'\0'
在某處嵌入了空字符,則報(bào)告的長(zhǎng)度strlen()
將不包括該'\n'
位置。
其他一些答案的問(wèn)題:
strtok(buffer, "\n");
無(wú)法刪除的'\n'
時(shí)候buffer
是"\n"
。從這個(gè)答案 - 在這個(gè)答案之后修改了警告這個(gè)限制。以下罕見(jiàn)的情況下出現(xiàn)故障時(shí),首先
char
通過(guò)閱讀fgets()
是'\0'
。輸入以嵌入式開(kāi)頭時(shí)會(huì)發(fā)生這種情況'\0'
。然后在合法范圍之外肯定buffer[len -1]
會(huì)buffer[SIZE_MAX]
訪(fǎng)問(wèn)內(nèi)存buffer
。黑客可能在愚蠢地閱讀UTF16文本文件時(shí)嘗試或找到的東西。寫(xiě)這個(gè)答案時(shí),這就是答案的狀態(tài)。后來(lái)一個(gè)非OP編輯它包括像這個(gè)答案的檢查代碼""
。size_t len = strlen(buffer);if (buffer[len - 1] == '\n') { // FAILS when len == 0 buffer[len -1] = '\0';}
sprintf(buffer,"%s",buffer);
是未定義的行為:參考。此外,它不會(huì)保存任何前導(dǎo),分隔或尾隨空格?,F(xiàn)在已刪除。[編輯由于后來(lái)的好回答 ]與方法
buffer[strcspn(buffer, "\n")] = 0;
相比,除了性能之外,1襯墊沒(méi)有問(wèn)題strlen()
。鑒于代碼正在進(jìn)行I / O(CPU時(shí)間的黑洞),修剪性能通常不是問(wèn)題。如果以下代碼需要字符串的長(zhǎng)度或具有高度的性能意識(shí),請(qǐng)使用此strlen()
方法。否則這strcspn()
是一個(gè)很好的選擇。
- 4 回答
- 0 關(guān)注
- 1321 瀏覽
添加回答
舉報(bào)