我打印一个函数可以从一个文件中获取特定的行,比如string = extract_line(2),那么该字符串将是文件第二行的内容。 但是当我试图将函数放在头文件中时,我得到了分段错误。
这是我的代码: test.c的:
#include "extract_line.h"
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
extract_line(2);
extract_line(3);
printf("%s\n", str);
return 0;
}
extract_line.h
#include <stdio.h>
#include <stdlib.h>
#define TEMP_PATH "/home/pi/project/PCD_8544_screen/show_on_LCD/network_speed.txt"
static char str[256];
void extract_line( int Tgt_Line )
{
FILE *fp;
fp=fopen(TEMP_PATH, "r");
// char str[256];
char holder;
int line=0;
while((holder=fgetc(fp)) != EOF) {
if(holder == '\n') line++;
if(line == Tgt_Line) break; /* 1 because count start from 0,you know */
}
if(holder == EOF) {
printf("%s doesn't have the 2nd line\n", fp);
//error:there's no a 2nd
}
int i=0;
while((holder=fgetc(fp)) != EOF && (holder != '\n' )) {
// putchar(holder);
str[i] = holder;
i++;
}
// printf("%s\n",str);
fclose(fp);
// return str;
}
答案 0 :(得分:0)
您需要有一个main()函数,或者您需要从任何其他函数中运行该脚本。
#include "extract_line.h"
#include <stdio.h>
#include <stdlib.h>
void main() {
extract_line(2);
extract_line(3);
printf("%s\n", str);
}
答案 1 :(得分:0)
在以下代码行中:
printf("%s doesn't have the 2nd line\n", fp);
您正在打印FILE *
,好像它指向一个字符串(文件名?)。由于printf
期望char *
,这可能会导致非理性行为。请注意,您的编译器可能正在向您宣传!也许你的意思是:
printf("%s doesn't have the 2nd line\n", TEMP_PATH);
此外,还有一种空指针取消引用的可能性,这也会导致以下两行之间的不合理行为:
fp=fopen(TEMP_PATH, "r");
// snip! you need to check fp here!
while((holder=fgetc(fp)) != EOF) {
在这方面,您的循环在char
是无符号类型的系统上是无限的,因为EOF
是负数,它可能无法比较等于任何无符号值。当fgetc
返回int
且其中unsigned char
且holder
为char
时,向下转换会丢弃您的循环终止所需的信息。 holder
应定义为int
,而不是。{/ p>
由于您的循环设置的字符数没有上限,因此可能str
可能会str[i] = holder;
超出范围'\0'
}。这可能会导致不合理的行为。
此外,似乎没有明确指定str
字符串终止符。由于static
定义了静态存储持续时间(不要与提供内部链接的size_t
关键字混淆),这实际上不会导致非理性行为,实际上它是非常可预测,但是如果第一个呼叫读取的行长于第二个呼叫,则输出可能与预期不符。
最后,只是一些挑剔的笔记:
int
而不是int i=0;
来预期 count 或引用数组元素的变量(例如size_t i=0;
应该是#include
)。这是为了明确表示负数是不可接受的,这也可能会使你的代码加速一点。gcc -o x.c
,代码进入我们链接到的代码文件(例如gcc main.c x.o
编译xc,然后"$@"
编译main.c并链接它与xo)。