我有一个C代码,它使用
从文本模式打开的文件中一次读取1行fgets(buf,200,fin);
fgets()从中读取行的输入文件是程序的命令行参数。
现在fgets将包含在字符串中的换行符复制到buf。
在某处我检查代码中的行
length = strlen(buf);
对于某些输入文件,我猜是在* nix环境中编辑的换行符只是'\n'
但是对于其他一些测试用例输入文件(我猜是在Windows环境下编辑/创建)有2个字符表示换行符 - '\r''\n'
我想删除换行符,并希望将'\ 0'作为字符串终止符。所以我要么做 -
if(len == (N+1))
{
if(buf[length-1] == '\n')
{
buf[length-2] = '\0'; //for a `\r\n` newline
}
}
或
if(len == (N))
{
if(buf[length-1] == '\n')
{
buf[length-1] = '\0'; //for a `\n` newline
}
}
由于文本文件作为命令行参数传递给程序,因此我无法控制它是如何编辑/编写的,因此无法使用某种工具对其进行过滤以使换行符保持一致。
我该如何处理这种情况?
标准C库(没有扩展名)中是否有任何fgets等效函数可以处理这些不一致的换行符并返回没有它们的字符串?
答案 0 :(得分:2)
我想同时更新length
if (buf[length - 1] == '\n') buf[--length] = 0;
if (buf[length - 1] == '\r') buf[--length] = 0;
或删除所有尾随空格
/* remember to #include <ctype.h> */
while ((length > 0) && isspace((unsigned char)buf[length - 1])) {
buf[--length] = 0;
}
答案 1 :(得分:1)
我认为你最好(也是最简单)的选择就是编写自己的strlen函数:
size_t zstrlen(char *line)
{
char *s = line;
while (*s && *s != '\r' && s != '\n) s++;
*s = '\0';
return (s - line);
}
现在,要计算字符串的长度(不包括换行符)并将其删除(/它们),您只需执行以下操作:
fgets(buf,200,fin);
length = zstrlen(buf);
适用于Unix风格('\ n'),Windows风格('\ r \ n')和旧Mac风格('\ r')。
请注意,strlen的执行速度更快(但非便携),您可以根据自己的需要进行调整。
希望它有所帮助, RD:
答案 2 :(得分:0)
如果您对不同机器上的不同行结尾(\n
和\r\n
)感到困扰,那么中和它们的一种方法是使用dos2unix
命令(假设您正在工作)在Linux上,并在Windows环境中编辑文件)。该命令将用linux风格的行结尾替换所有窗口样式的行结尾。反向unix2dos
也存在。您可以在C程序中调用这些实用程序(可能是system
),然后像您当前那样处理该行。这样可以减轻程序的负担。