如何在c中从库中传递数组

时间:2014-03-03 13:33:11

标签: c arrays parameter-passing libraries

我是c编程的新手,我想从库中传递数组。 我在库c文件中有函数创建char数组。如何在main函数中使用此数组。这是我尝试过的简短代码:

libfile.c

char *myArray;
void PopulateArray()
{
  // Getting data from serial port in char buffer[100]
  myArray = buffer;
} 

libfile.h

exter char *myArray;
void PopulateArray();

program.c

int main()
{
   // in fore loop
  printf("%s\n" , myArray[i]);
}

这只是我尝试过的一种组合,但没有任何效果。 怎么做?

2 个答案:

答案 0 :(得分:1)

要将数组从库函数传递给周围的代码,可以使用函数的返回值或使用指针到指针的参数。

请参阅以下示例代码。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* createSourceCopy() {
    const char *source = "Example Text";
    // We got some text in variable source;
    const size_t sourceSize = strlen(source);
    char *result = (char*)malloc(sizeof(char)*(sourceSize+1));
    strncpy(result, source, sourceSize);
    return result;
}

您图书馆的用户可以使用以下功能:

main() {
    char *result = createSourceCopy();
    // Do something with result.
    // After the use, destroy the array
    delete[] result;
    return 0;
}

如何传递数组的另一种方法是:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

bool copySourceText( char **outText ) {
    const char *source = "Example Text";
    // We get some text in variable source;
    const size_t sourceSize = strlen(source);
    *outText = new char[sourceSize];
    strncpy(*outText, source, sourceSize);
    return true; // success
}

第二种变体的好处是返回值可以用作状态。该函数可以在成功时返回true,如果有错误则返回false

第二个版本可以像这样使用。

int main() {
    char *result;
    if (copySourceText(&result)) {
        // Do something with result.
        // After the use, destroy the array
        free(result);
        result = NULL;
    } else {
        // Error handling
    }
    return 0;
}

答案 1 :(得分:0)

目前尚不清楚您发布的代码到底出了什么问题(这有助于查看更多代码),但假设您的问题不是编译错误,其中一行可能是错误的:

char *myArray;
printf("%s\n" , myArray[i]);
  • char *myArray声明一个指向char的指针(适用于单个字符串)。

  • printf行解除引用myArray(生成char,即一个字符。您传递的是char,但%s格式需要指针指向char

如果您想逐个字符地打印字符串,可以使用%c

for (i = 0; i < length; i++) {
    printf("%c\n", myArray[i]);   /* or %x or %d if you want */
}

否则,如果myArray是一个字符串且以空值终止(请参阅Why is a null terminator necessary?),那么您可以这样做:

printf("%s\n" , myArray);   /* [i] removed, no for loop necessary */