C编程:从函数返回字符串

问题描述:

我打印一个函数可以从文件中得到特定的行,如string = extract_line(2),那么字符串将是文件的第二行的内容。 但是当我试图把该函数放在头文件中时,我得到了Segmentation错误。C编程:从函数返回字符串

这里是我的代码: 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

@seb我会在稍后添加它,但这不是主要问题。 –

+0

当然是!我希望如何保证我没有它就能复制你的行为?也许你的文件丢失了!停止行事愚蠢。 – Sebivor

+0

对不起,我只是C语言的新手。 –

在以下代码行中:

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


至于有多少个字符读取你的循环没有设定上限,则可能是str可以在str[i] = holder;被访问(和分配)出界。这可能会导致不合理的行为。


此外,它似乎有一个'\0'字符串结束的没有明确的分配。由于str定义为静态存储时间(不要与您提供内部链接的static关键字混淆),这并不会真正导致非理性行为,事实上这是非常可预测的,但是您的输出可能不如您期望的那样第一次呼叫读取比第二次呼叫更长的行。


最后,短短挑剔说明:

  • 我建议使用size_t而不是int为变量,预计计数数组元素(如int i=0;应该size_t i=0; )。这是为了明确指出负数不可接受,这也可能会加快你的代码的速度。
  • 把代码放在头文件中有点奇怪。通常,定义只进入头文件,我们将#include和代码放入我们链接到的代码文件中(例如,gcc -o x.c编译x.c,然后gcc main.c x.o编译main.c并将其与x.o链接)。

你需要有一个main()函数,或者你需要从内的任何运行脚本其他功能..

#include "extract_line.h" 
#include <stdio.h> 
#include <stdlib.h> 

void main() { 
    extract_line(2); 
    extract_line(3); 
    printf("%s\n", str); 
} 
+0

哈,烨刚刚发现这个愚蠢的错误以及... –

+0

是现在的代码? – Arvindsinc2

+0

[C11/5.1.2.2.1 *程序启动*](http://www.iso-9899.info/n1570.html#5.1.2.2.1)有关*'void main()'*的说法? – Sebivor