C编程:从函数

时间:2017-04-09 04:37:51

标签: c

我打印一个函数可以从一个文件中获取特定的行,比如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;
    }

2 个答案:

答案 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 charholderchar时,向下转换会丢弃您的循环终止所需的信息。 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)。