2015-03-03 3 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

Обратите внимание, что для большинства целей вам следует учитывать имена, начинающиеся с символа подчеркивания, зарезервированные для используемой реализации. Вы уйдете с ним на удивление часто, но не навсегда. И это повредит, когда вам это не удастся. –

+1

@ user3337714 Самое простое решение - запустить в отладчике и посмотреть, где именно он разбился. Но в любом случае я не думаю, что он даже компилируется - ваш 'input' имеет тип' char', но 'search' ожидает' char * ', а' scanf' - 'char' (с форматом'% s') почти конечно, неверно. Вы должны скомпилировать код с включенными предупреждениями (по крайней мере, '-Wall' для gcc/clang). – keltar

+1

@JonathanLeffler: Идентификаторы, начинающиеся с символа * double * или подчеркивания, за которым следует заглавная буква, зарезервированы для реализации. Единственное подчеркивание и строчная буква в порядке. –

ответ

3

В вашей основной функции у вас есть «char input;» и «scanf («% s », input);». Это неправильно, потому что% s задает строковый параметр, но input - это переменная char. Таким образом, все, что вводится пользователем, хранится в некотором случайном месте в памяти.

Измените объявление ввода на что-то известь «char input [1000];». И вам придется что-то делать с вашим циклом while.

0

Вы должны объявить функцию search, прежде чем пытаться использовать его.

Компилятор должен предупредить вас об этом неявном объявлении.

+0

Я просто сделал. Спасибо, что указали. Но теперь я получаю параметр ввода, но нет вывода – user3337714

+0

@ user3337714 вы можете изменить вопрос? –

0

Если вы получаете ошибку сегментации, то один применяется следующее:

  1. Ваш структура Blackbox в search функция не указывает на правильное местоположение памяти и, таким образом, Blackbox[i] производит вина
  2. name член структура не указывает на действительное место памяти и, следовательно, Blackbox[i].name создает ошибку
  3. Размер массива Blackbox составляет менее size-1.

Для этого используйте отладчик и проверьте Blackbox, где указано. Затем проверьте Blackbox.name, где указывается. Затем проверьте, есть ли что-нибудь для массива Blackbox до size-1. Я предполагаю, что либо будет null. Возможно, ошибка в назначении функции load или неправильное использование size.

Смежные вопросы