【问题标题】:How to discard the rest of a line in C如何在C中丢弃一行的其余部分
【发布时间】:2014-04-26 17:35:08
【问题描述】:

我正在尝试编写一个函数来删除 C 中的一行的其余部分。我正在传递一个 char 数组和一个文件指针(从中读取 char 数组)。该数组应该只包含 80 个字符,如果数组中没有换行符,则读取(并丢弃)文件中的字符,直到到达它(换行符)。这是我到目前为止所拥有的,但它似乎没有工作,我不确定我做错了什么。任何帮助将不胜感激!以下是有关该函数应该做什么的给定信息:

discardRest - 如果 fget 没有读取换行符,则没有读取整行。此函数将最近读取的行和指向正在读取的文件的指针作为输入。 discardRest 在输入行中查找换行符。如果换行符不在行中,则函数从文件中读取(并丢弃)字符,直到读取换行符为止。这将导致文件指针定位到输入文件中下一行的开头。

这是代码:

void discardRest(char line[], FILE* file)
{
    bool newlineFound = FALSE;
    int i;
    for(i = 0; i < sizeof(line); i++)
    {
        if(line[i] == '\n') newlineFound = TRUE;
    }
    if(!newlineFound)
    {
        int c = getc(file);
        while(c != '\n')
        {
            c = getc(file);
        }
    }
}

【问题讨论】:

  • 乍一看:sizeof(line) 可能不会像您认为的那样做,因为数组衰减为指针。
  • 你是如何阅读你的台词的? fgets?
  • 是的,我最初使用 fgets 来读取该行。
  • @user3477950 在 Clang 中所说的“警告:数组函数参数上的 sizeof 将返回 'char *' 的大小而不是 'char []'”

标签: c


【解决方案1】:

你的方法太难了,除了sizeof总是给出它的操作数的大小,它是一个指针而不是你认为它指向的数组。

fgets 有以下合约:

  • return NULL: 某种错误,不要使用缓冲区,它的内容可能是不确定的。
  • 否则缓冲区包含以 0 结尾的字符串,如果缓冲区和文件都足够大,则最后一个非 0 为保留的 '\n'

因此,这应该有效:

  1. 所以,使用strlen() 来获取缓冲区长度。
  2. 确定是否读取了整行 (length &amp;&amp; [length-1] == '\n')
  3. 视情况而定:
    • 删除换行符并返回。
    • 像您尝试的那样丢弃该行的其余部分。

【讨论】:

  • 我不完全确定您所说的行是什么意思: (length && [length-1] == '\n') 我假设您的意思是 strlen(line) 的可变长度,但这如何确定是否已读取整行?
  • 所以假设我是个白痴,因为根据你解释的方式我仍然不明白
  • 好的,该行假设 fgets 没有遇到错误,然后检查由空字符串表示的文件的立即结束,然后在终止符之前是否存在换行符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 2018-06-07
  • 2018-04-20
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多