从文件中读取换行符后,这是一种安全的方法来修剪换行符吗?
while ( fgets(buffer, 1024, fp) != NULL )
{
buffer[strlen(buffer)-1] = '\0';
fprintf (stderr, "%s\n", buffer);
}
它没有给我任何seg故障,但它可能会导致问题吗? 我应该这样做吗?
while ( fgets(buffer, 1024, fp) != NULL )
{
tmp = (char *) malloc(strlen(buffer));
strncpy(tmp, buffer, strlen(buffer) - 1);
tmp[strlen(buffer)-1] = '\0';
fprintf (stderr, "%s\n", tmp);
}
答案 0 :(得分:7)
我发现您的第一个选项没有任何实际问题 - 如果您拥有buffer
,则可以修改它。只是几个小问题:
fgets
实际上可能不会返回换行符(编辑:或者如果该行不适合缓冲区,如Aaron所指出的那样) - 所以你应该检查那里是否有换行符。
此外,我会在访问strlen(buffer)>0
之前检查buffer[strlen(buffer)-1]
。
请注意,您的第二个选项有一个错误 - 它分配的字节太少(空字符需要额外的字节)。
答案 1 :(得分:1)
如果该行不适合缓冲区,则不会有尾随换行符,因此您的方法可能会删除有效字符。所以为了安全起见,你应该:
int len = strlen(buffer);
if (len > 0 && buffer[len-1] == '\n')
buffer[len-1] = 0;
当然,这不适用于Mac或Windows(分别使用\r
和\r\n
)。
答案 2 :(得分:1)
...假设
1)缓冲区是1024字符数组和...
2)您正在读取的缓冲区没有长度为1024个字符的行,然后是\ n。\ n
3)你在UNIX中,\ n是终止字符。 \ r \ n在Windows中,\ r \ n在Mac上。换句话说,你的代码不是真正可移植......但如果这不是问题,那就不用担心了。
如果2是可能的,那么你有一些问题......
A)你将取消一个字母而不是一个\ n。
B)您只能读取该行的一部分,并且在到达下一行行之前,要处理的行中会有一些剩余的字节(或者像这样丢弃:{{ 1}}或{ fscanf(fp, "%*[^\n]"); fgetc(fp); }
)
否则,第一种解决方案就没问题了。
第二种解决方案是不必要的,你会发现动态内存分配相比非常慢。
答案 3 :(得分:1)
使用strchr()
在缓冲区中搜索换行符:
if (fgets(buffer, sizeof buffer, stdin))
{
char *c = strchr(buffer, '\n');
if (c)
*c = 0;
...
}
答案 4 :(得分:0)
根据您在那里阅读的内容以及处理方式的继续,您可以使用isspace()
中的<ctype.h>
确保您要修剪的内容实际上是一个空格。