2015-03-03 105 views
0

void search(struct _data *BlackBox, char *name, int size) - 此函數 將獲得傳遞給它的結構的動態數組,我們正在查找的名稱爲 ,以及數組的大小。此功能將搜索動態 數組的名稱。在C中搜索結構

typedef struct _data 
{ 
    char* name; 
    long number; 
} _data; 

int scan(FILE *(*stream)); 
struct _data *load(FILE *stream, int size); 
void search(struct _data *Blackbox, char *name, int size); 

int main() 
{ 
    int size = scan(&stream);  
    rewind(stream); 
    _data *data = load(stream, size); 

    char input; 
    printf("Please Input Search Name: "); 
    scanf("%s", input); 
    while (input != NULL) 
    { 
     search(data, input, size); 
    } 
} 

void search(struct _data *Blackbox, char *name, int size) 
{ 
    for (int i=0; i<size; i++) 
    { 
     if (strcmp(name,Blackbox[i].name) != 0) 
     { 
      printf("Success"); 
     } 
     else 
     { 
      printf("Name Not Found"); 
     } 
    } 
} 

但我得到以下輸出

Output: 
LINES: 2 
ron 7774013 
jon 7774014 
Please Input Search Name: ron 

RUN FINISHED; Segmentation fault: 11; real time: 2s; user: 0ms; system: 0ms 
+0

請注意,對於大多數用途,您應該考慮以下劃線開頭的名稱作爲保留供實施使用。你會經常驚訝地擺脫它,但不會永遠。如果你不擺脫它,它會受到傷害。 – 2015-03-03 06:09:38

+1

@ user3337714最簡單的解決方案是在調試器中運行,看看它在哪裏崩潰。但無論如何,我認爲它甚至不會編譯 - 你的'input'有'char'類型,但'search'需要'char *','scanf'到'char'(格式爲'%s')幾乎是當然不正確。你應該編譯開啓警告的代碼(至少'-Wall'代表gcc/clang)。 – keltar 2015-03-03 06:19:06

+1

@JonathanLeffler:以* double *下劃線或下劃線後跟大寫字母開頭的標識符被保留用於實現。單個下劃線和小寫字母都可以。 – 2015-03-03 06:21:26

回答

3

在你的主函數中有「char input」和「scanf(」%s「,input);」。這是錯誤的,因爲%s指定了一個字符串參數,但輸入是一個char變量。因此,無論用戶輸入什麼,都會存儲在內存中的某個隨機位置。

將輸入聲明更改爲「char input [1000];」。而且你必須對你的while循環做些什麼。

0

您需要聲明search功能您嘗試使用它之前。

編譯器甚至應該警告你隱式聲明。

+0

我剛剛做到了。謝謝你指出。但是現在我得到了輸入選項,但是沒有輸出 – user3337714 2015-03-03 06:01:08

+0

@ user3337714可以編輯這個問題嗎? – 2015-03-03 06:03:56

0

如果你得到一個分段錯誤,然後一個適用:

  1. 你的結構Blackboxsearch功能並不指向有效的存儲位置,因此Blackbox[i]產生故障
  2. name成員結構沒有指向有效的內存位置,因此Blackbox[i].name正在產生錯誤
  3. Blackbox數組的大小小於size-1

爲此,請使用調試器並檢查Blackbox指向的位置。然後檢查Blackbox.name指向哪裏。然後,檢查Blackbox數組中是否有任何內容,最多爲size-1。我認爲或者將是空的。可能是load功能的分配錯誤或size的錯誤使用。