繁体   English   中英

在c中读取文件时出现分段错误

[英]segmentation fault when read file in c

我尝试编写获取字符数组的函数,从文件中插入行是从重定向中获取的,并返回文件的长度。

我试过:

#define LINE 256
int getline1(char s[]){
    char ch;
    int length = 0;
    scanf("%c", &ch);
    while(ch != '\n' && ch != EOF){
        s[length++] = ch;
        scanf("%c", &ch);
    }
    s[length] = '\0';
    return length;
}

int main(){
    char line[LINE];
    while(getline1(line) != 0){
        printf("%s\n", line);
        char line[LINE];
    }
    return 0;
}

但我遇到分段错误,我不明白为什么?

输入 ./main < find_input.txt

find_input.txt:

一种

编辑:

我添加了while(ch != '\\n' && ch != EOF && length < LINE)到 while 但现在我得到了一个垃圾。 出于某种原因,我不会在文件末尾退出 while。

您的程序由于未检查scanf函数的返回值而失败。 此外,表达式 (ch != EOF) 作为控制表达式的一部分在您的while循环中没有任何意义。 您正在根据 EOF 检查字符变量 (ch)。 这几乎总是表明代码中存在错误。 EOF 不是字符:它是一个int类型(和一个负值)的整数常量表达式,由几个标准库函数返回以指示文件结束(或有时是输入错误)。 例如,如果在任何转换之前发生输入失败,则scanf函数返回 EOF。 否则,它返回分配的输入项数,该数可以为零。 所以你要实现的函数可以写成:

int getline1(char s[])
{
    char ch;
    int length = 0;
    /* The scanf call below will return 1 if it reads a character from stream */
    while (scanf("%c", &ch) == 1 && ch != '\n')
            s[length++] = ch;

    s[length] = '\0';
    return length;
}

但是上面的函数有一个致命的缺陷:它不知道调用函数中数组的长度。 从函数的角度来看,参数s只是一个指针,仅凭指针是不可能确定该信息的。 如果从流中读取的字符数大于数组的大小,它将不会在数组末尾停止写入。 取而代之的是,它继续写到末尾并写入它不拥有的内存中。 此功能无法安全使用 因此,必须将数组大小作为此类函数的参数传递。 所以更安全的实现可能是:

int getline1(char s[], int size)
{
    char ch;
    int length = 0;

    if (size < 1)
            return 0;

    while (length < size - 1 && scanf("%c", &ch) == 1 && ch != '\n')
            s[length++] = ch;

    s[length] = '\0';
    return length;
}

这个函数应该像

getline1(line, sizeof line)

只要字符数组的原始定义是可见的。

注意:C 程序员通常更喜欢使用getchar函数从stdin读取一个字符。 为此目的使用scanf (带有 %c)本身并不是错误,但可能效率低下。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM