猿问

从fgets()输入中删除尾随换行符

从fgets()输入中删除尾随换行符

湖上湖
浏览 1238回答 4
4回答

HUX布斯

有点丑陋的方式:char *pos;if ((pos=strchr(Name, '\n')) != NULL)     *pos = '\0';else     /* input too long for buffer, flag error */有点奇怪的方式:strtok(Name, "\n");请注意,strtok如果用户输入空字符串(即仅按Enter),则该功能无法按预期工作。它使\n角色完好无损。当然还有其他一些。

米脂

也许最简单的解决方案使用我最喜欢的一个鲜为人知的功能strcspn():buffer[strcspn(buffer, "\n")] = 0;如果你想要它也处理'\r'(比如,如果流是二进制):buffer[strcspn(buffer, "\r\n")] = 0; // works for LF, CR, CRLF, LFCR, ...该函数计算字符数,直到它击中a '\r'或a '\n'(换句话说,它找到第一个'\r'或者'\n')。如果没有碰到任何东西,它会停在'\0'(返回字符串的长度)。请注意,即使没有换行,这也可以正常工作,因为strcspn在a处停止'\0'。在这种情况下,整条生产线只是替换'\0'为'\0'。

海绵宝宝撒

size_t ln = strlen(name) - 1;if (*name && name[ln] == '\n')      name[ln] = '\0';

Cats萌萌

以下是'\n'从保存的字符串中删除潜在的快速方法fgets()。它使用strlen()2次测试。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';   }现在使用buffer并len根据需要。此方法具有len后续代码值的附带好处。它可以比它快得多strchr(Name, '\n')。 参考 YMMV,但两种方法都有效。buffer,从原来fgets()不会包含在"\n"某些情况下:A)线太长,buffer所以只有char在'\n'保存之前buffer。未读的字符仍保留在流中。B)文件中的最后一行没有以a结尾'\n'。如果输入'\0'在某处嵌入了空字符,则报告的长度strlen()将不包括该'\n'位置。其他一些答案的问题:strtok(buffer, "\n");无法删除的'\n'时候buffer是"\n"。从这个答案 - 在这个答案之后修改了警告这个限制。以下罕见的情况下出现故障时,首先char通过阅读fgets()是'\0'。输入以嵌入式开头时会发生这种情况'\0'。然后在合法范围之外肯定buffer[len -1]会buffer[SIZE_MAX]访问内存buffer。黑客可能在愚蠢地阅读UTF16文本文件时尝试或找到的东西。写这个答案时,这就是答案的状态。后来一个非OP编辑它包括像这个答案的检查代码""。size_t len = strlen(buffer);if (buffer[len - 1] == '\n') {  // FAILS when len == 0   buffer[len -1] = '\0';}sprintf(buffer,"%s",buffer);是未定义的行为:参考。此外,它不会保存任何前导,分隔或尾随空格。现在已删除。[编辑由于后来的好回答 ]与方法buffer[strcspn(buffer, "\n")] = 0;相比,除了性能之外,1衬垫没有问题strlen()。鉴于代码正在进行I / O(CPU时间的黑洞),修剪性能通常不是问题。如果以下代码需要字符串的长度或具有高度的性能意识,请使用此strlen()方法。否则这strcspn()是一个很好的选择。
随时随地看视频慕课网APP
我要回答