получить массив из другого файла в C - PullRequest
1 голос
/ 28 марта 2012

У меня есть эти методы.Я определил массив символов в файле stringcontent.h, и этот массив взят из метода в другом файле test.c.

// stringcontent.h
char content1[] = "blahblah";
void  get_char_array(int which,char  *buffer){
   if(which == 1)
      buffer = content1;
      printf("%s",buffer); // prints : "blahblah"
   // and so on.....
}

// test.c
#include "stringcontent.h"
main(){
    char *buf;
    get_char_array(1,buf);
    printf("%s",buf); // prints rubbish rubbish !!!
}

Я должен придерживаться интерфейса этого метода (сигнатуры функций) и как можноЯ это исправлю?

Ответы [ 2 ]

3 голосов
/ 28 марта 2012

Если я понимаю, вы хотите получить переменную, используя функцию get_char_array.Тогда Если я понимаю, вам нужно сделать следующее (измените функцию get_char_function, чтобы получить указатель на указатель на символ):

// stringcontent.h
char content1[] = "blahblah";
void  get_char_array(int which,char  **buffer){
   if(which == 1)
      *buffer = content1;
      printf("%s",*buffer); // prints : "blahblah"
   // and so on.....
}

// test.c
#include "stringcontent.h"
main(){
    char *buf;
    get_char_array(1,&buf);
    printf("%s",buf); // prints "blahblah" !!!
}

РЕДАКТИРОВАТЬ:

Положите объявления в заголовочном файле и реализация в ".c", иначе у вас будут ошибки компоновщика.

// stringcontent.h
#ifndef __STRINGCONTENT_H
#    define __STRINGCONTENT_H

void  get_char_array(int which,char  **buffer);

#endif

// stringcontent.c
char content1[] = "blahblah";
void  get_char_array(int which,char  **buffer){
   if(which == 1)
      *buffer = content1;
      printf("%s",*buffer); // prints : "blahblah"
   // and so on.....
}

// test.c
#include "stringcontent.h"
main(){
    char *buf;
    get_char_array(1,&buf);
    printf("%s",buf); // prints "blahblah" !!!
}

Для компиляции (если используется gcc):

gcc -Wall test.c stringcontent.c -o test

Обратите внимание, что вам не нужно "экспортировать" content1, так как единственное, что вам нужно, указатель, возвращается функцией.



Вот еще одно решениеиспользуя strcpy.В этом случае вам не нужно передавать указатель на указатель.

// stringcontent.h
char content1[] = "blahblah";
void  get_char_array(int which,char  *buffer){
   if(which == 1)
      strcpy(buffer,content1);
      printf("%s",buffer); // prints : "blahblah"
   // and so on.....
}

// test.c
#include "stringcontent.h"
#define GOOD_SIZE (100)
main(){
    char buf[GOOD_SIZE];
    get_char_array(1,buf);
    printf("%s",buf); // prints "blahblah" !!!
}

В этом случае вы должны позаботиться о том, чтобы выделить достаточный размер в buf перед вызовом get_char_array.

Iпредпочитаю первое решение, ему не нужно использовать strcpy.И если вы не выделите достаточно места в буфере, у вас могут возникнуть проблемы.Одним из решений является передача размера buf в функцию и проверка его перед strcpy или использование strncpy.

0 голосов
/ 28 марта 2012

Использование:

extern char content1[];

объявление в stringcontent.h и поместите ваше определение массива и определение функции в файл с именем stringcontent.c. Вы не должны помещать определения объектов и функций в заголовочные файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...