2017-04-09 57 views
0

我打印一個函數可以從文件中得到特定的行,如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語言的新手。 –

回答

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


至於有多少個字符讀取你的循環沒有設定上限,則可能是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鏈接)。
0

你需要有一個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