Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何修剪&x27\n';从fgets()输出的末尾_C - Fatal编程技术网

C 如何修剪&x27\n';从fgets()输出的末尾

C 如何修剪&x27\n';从fgets()输出的末尾,c,C,我想从fgets输出中修剪换行符 while(fgets(buff,1024,fp) ){ printf("start%send",buff ); 如果文件中有一行“C很酷”。然后打印上面的代码 startC is cool end 但我想把它打印成这样 startC is coolend 如何做到这一点清洁方法 #include <string.h> //... buff [ strcspn(buff, "\r\n") ] = 0; #包括 //...

我想从fgets输出中修剪换行符

while(fgets(buff,1024,fp) ){

    printf("start%send",buff );
如果文件中有一行“C很酷”。然后打印上面的代码

startC is cool
end 
但我想把它打印成这样

 startC is coolend 
如何做到这一点

清洁方法

#include <string.h>

//...

buff [ strcspn(buff, "\r\n") ] = 0;
#包括
//...
buff[strcspn(buff,“\r\n”)]=0;

这将安全地适用于任何类型的行尾,即使行尾不存在,或者字符串为空。

您可以将最后一个字符设置为
'\0'
(空终止符)。这不是一个好方法,因为文件可能并不总是有换行符

buff[strlen(buff) - 1] = '\0';
或在字符数组端上循环将
'\n'
替换为
'\0'

int i;
for(i = 0; i < strlen(buff); i++)
{
    if(buff[i] == '\n')
    {
        buff[i] = '\0';
        break;
    }
}

脏进近
buff[strlen(buff)-1]=0
@Lashane:如果没有输入(EOF)并且
strlen(buff)
为0,那么这是很危险的。从文件中读取的最后一行可能没有
换行符,在这种情况下,您的第一个示例很弱。
换行符
不是由
fgets
添加的,它是文件中的内容。没错,我之所以包含它,是因为它是一种解决这个问题的方法。我将进行编辑以澄清这不是一个好的方法。如果
strlen(buff)
为0,则会产生危险的未定义行为。在这种情况下不会发生这种情况,因为fgets将返回一个空指针,这将导致while循环条件失败,但是注释是误导性的,并且与答案的其余部分相反。@R。。谢谢,但是你能解释一下你对我的评论的评论吗?评论说的是尾随的换行符,但是你的代码实际上做的是在第一个换行符(或回车符)处截断字符串
fgets
无法生成除尾随换行符之外的换行符,但可以有大量嵌入的回车符。@R。。如果有,那么您可以修改代码以适应。但我通常不会在文本文件中遇到“大量嵌入式回车”。即使它是一个源代码文件,在字符串文本中,它们也会被转义。我不认为这是一个重大的实际问题,只是评论令人不安。无论如何,我还是会的。
buff[strcspn(buff, "\r\n")] = 0;