c从文件读取输入时修剪换行符

时间:2009-09-24 15:45:25

标签: c file-io

从文件中读取换行符后,这是一种安全的方法来修剪换行符吗?

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);
}

5 个答案:

答案 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>确保您要修剪的内容实际上是一个空格。