[英]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.