【问题标题】:how to write getLine function uses getc如何编写getLine函数使用getc
【发布时间】:2015-01-06 14:30:42
【问题描述】:

我想用函数原型从 txt 文件中获取行

int getLine(FILE* ptr,char* buffer);

但是我有一个堆栈问题...

int getLine(FILE* ptr,char* buffer){
int c;
while ( c = getc(ptr) != EOF && c != '\n'){
    *buffer++ = c;
    }
*buffer = '\0';
return 1;
}

分段错误(核心转储)

【问题讨论】:

  • 你讨厌括号吗? :) while ( c = getc(ptr) != EOF && c != '\n') -> while (((c = getc(ptr)) != EOF) && (c != '\n'))。你怎么知道buffer 适合角色?
  • 我认为没有必要在每个表达式周围加上括号。然而,有必要将它们写在getc 周围,分配为(c = getc(ptr) != EOF)0/1 分配给c 并返回等效的布尔值,而(c = getc(ptr)) != EOF 根据从getcc 读取的内容返回true/false .
  • 由于运算符优先级,写(c = getc(ptr)) != EOF比较重要。
  • 我的代码有什么问题?
  • 是的,看我的回答。

标签: c++ c visual-c++


【解决方案1】:

这里

c = getc(file) != EOF

你正在分配比较的结果

getc(file) != EOF

c,就像你这样做

c = (getc(file) != EOF)

所以你应该加上括号,因为operator precedence,所以更正的代码是

while ((c = getc(ptr)) != EOF && c != '\n')

您还应该确保不会将传递给函数的 char *buffer 写过去,因此传递它的大小,然后迭代直到找到 '\n' 或直到没有更多空间为止。

建议

int getLine(FILE* file, char* buffer, size_t size)
{
    int    c;
    size_t count;
    if (buffer == NULL)
        return 0;
    while ((size < count - 1) && ((c = getc(file)) != EOF) && (c != '\n'))
    {
        *buffer++ = (char)c;
        count++;
    }
    *buffer = '\0';
    return 1;
}

您必须传递一个预先分配的缓冲区,它的大小是为了防止尝试在缓冲区末尾添加字符。

【讨论】:

    【解决方案2】:

    调用我写的函数需要是

    char strName[30];

    而不是

    char* strName;

    所以需要预先分配缓冲区... 并通过

    调用
    getLine(fp,strName);
    

    而 fp 是 FILE*

    int getLine(FILE* ptr,char* buffer){
    int c;
    while (((c = getc(ptr)) != EOF) && (c != '\n')){
        *buffer++ = c;
        }
    *buffer = '\0';
    return 1;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-14
      • 2015-01-14
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      相关资源
      最近更新 更多