如何在 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
我想用字符 ',' 拆分 "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