如何在 C 函数中接收 char 数组?

How do I receive a char array in a C function?

我想用字符 ',' 拆分 "string"。 该字符串包含一个 GPS NMEA 编码字符串,但这无关紧要。

我的问题是有时处理此 char 数组的函数的参数为​​空...就像数组中没有任何内容一样。

我应该如何正确地将 "char string[]" 传递给函数,以便我可以在发送它时对那个参数进行操作(作为 char 数组,而不是指向数组的 char 指针)。

我还需要说明我正在为 PIC 使用 mikroC。

这是我目前的代码:

char* GPS_sateliti;
char CsatInView[] = 
"$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74";

GPS_sateliti = GrupeazaDupaVirgule(CsatInView, 2);

char* GrupeazaDupaVirgule( char deGasit[],int nrVirgule ){
    int cVirgule = 1;
    char* pch = strtok (deGasit,",");

    while (pch != 0)
    {
       pch = strtok (0, ",");
       cVirgule++;
       if(nrVirgule == cVirgule){
          break;
    }
}
return pch;
}

debug模式下对作为参数接收的char数组进行操作的函数,进入函数前char数组还好,进入后好像是空的

可能我应该收到一个指向字符数组的指针?? 欢迎任何形式的建议。 谢谢

How should I correctly pass a "char string[]" to a function so that I may operate on a that parameter as I sent it(as a char array, not a char pointer to an array).

你不能。数组类型的函数参数总是随着相应的指针类型衰减。

对此有两种惯用的解决方案。

1。一个哨兵:

数组中的最后一个值是一个特殊值,表示结束。这是在 C 语言中用字符串完成的。它们总是以 [=12=] 字符结尾,保证不会出现在字符串中。该函数可以搜索该字符以了解数据的结束位置。

(注意:有了这个信息,我必须添加我不确定你的问题是什么。如果你传递一个“空字符串”,字面意思是 ""[= 12=] 会在那里,所以你应该没有问题)

2。显式传递大小:

而不仅仅是

void foo(int bar[]);

你定义一个函数

void foo(size_t barSize, int bar[]);

调用者知道数组的大小,所以可以直接传递。

用指针:

char* arr; 
yourFunction(arr);

如果你想在之前初始化它:

char* arr = malloc(51 * sizeof(char)); // Allocate a memory place of 50 because strings are null terminated in C
yourFunction(arr);

为数组分配内存的另一种方法:

char* arr = calloc(50, sizeof(char)); // Allocate 50 memory place which size if the size of a char

用字符串:

char arr[50];
char* ptr = arr;
yourFunction(ptr);

你要知道在C语言中使用指针是不可能知道数组的大小的。您唯一可以做的就是将字符串的大小解析为参数:

size_t size = 50;
char arr[size];
char* ptr = arr;
yourFunction(ptr, size);

如果您想详细了解指针的工作原理以及如何迭代它们,可能 this post 可以帮助您。我认为这很有趣。 在全球范围内,您通过这样的指针遍历数组:

for ( int i = 0; i < size; i++)
    printf("Current pointed value in the array : %c\n", ptr[i]); // or arr[i]

我猜你明白为什么给一个指向数组的 size 作为参数很重要。 有时您可以避免像这样使用此参数:

for ( int i = 0; i != '[=16=]'; i++) // Because strings are null-terminated in C.
    // Do something