char数组参数的函数

时间:2014-05-12 06:04:14

标签: c arrays pointers parameter-passing

我正在尝试编写一个函数,用于在PIC中为PIC微控制器打印文本(我认为它基于gcc)。

void print(char[] text);

void print(char[] text)
{
    for(ch = 0; ch < sizeof(text); ch ++)
    {
        do_something_with_character(text[ch]);
    }
}

并将其称为:

print("some text");

我收到关于错误括号的编译器投诉。

  1. 这有什么问题?

  2. 在这种情况下如何使用char数组指针?

6 个答案:

答案 0 :(得分:4)

如其他答案中所述,您的语法不正确。括号在 text之后属于

同样非常重要的是,sizeof

void print(char[] text)
{
    for(ch = 0; ch < sizeof(text); ch ++)
                     ^^^^^^

请记住,sizeof编译时运算符 - 编译器会在构建代码时将其替换为大小。它不可能在运行时知道大小。

在这种情况下,sizeof(text)总是会在大多数32位系统上返回sizeof(void*)或4。您的平台可能会有所不同。


您有两种选择:

  • 将长度传递给另一个参数进行打印。
  • char[]视为"C string",其中长度未知,但字符串以NUL字符终止。

后者是您最好的选择,您应该将char[]替换为char*

这里我们使用一个以NUL结尾的字符串,并用指针迭代它:

void print(const char* text)
{
    const char* p;

    // Iterate over each character of `text`,
    // until we reach the NUL terminator
    for (p = text; *p != '\0'; p++) {

        // Pass each character to some function
        do_something_with_character(*p);
    }
}

答案 1 :(得分:4)

正确的语法是

void print(char text[])

void print(char *text)

print()中,您无法使用sizeof运算符查找字符串text的长度,您需要先使用strlen()(首先包括<string.h>)或者测试text[ch]\0

答案 2 :(得分:3)

我会这样做:

void print(char *text);

void print(char *text)
   {
   while(*text)
      {
      do_something_with_character(*text);
      ++text;
      }
   }

答案 3 :(得分:2)

您必须将方括号放在正确的位置:

void print(char[] text);

void print(char[] text)

void print(char text[]);

void print(char text[])

或使用指针表示法:

void print(char *text);

void print(char *text)

另外,请注意,即使您使用数组表示法,该参数也会被有效地重写为指针,然后是函数体中的代码:

for(ch = 0; ch < sizeof(text); ch ++)

错了。你几乎肯定不希望4或8字节是指针的大小。你可能想要:

size_t len = strlen(text);
for (size_t ch = 0; ch < len; ch++)

如果无法在循环中声明变量(需要C99或更高版本),请单独声明。您没有在代码中显示ch的声明。如果它被编译,那意味着ch是一个全局变量 - 这是非常可怕的。

请注意,++运算符紧密绑定,不应与空格分开。

答案 4 :(得分:1)

通过指针传递C风格的字符串,或者在变量名称后传递括号:

void print(char *text);
                ^

void print(char text[]);
                    ^^

要计算字符串的长度,请使用strlen而不是sizeof

int len = strlen(text);
for(ch = 0; ch < len; ch ++)
                 ^^^^

答案 5 :(得分:1)

根据你的问题以及你可能是C语言的初学者的观察来看,我会尝试回答你的问题而不使用像其他答案这样的指针。

首先,Jonathon Reinhart提出了一个很好的观点,sizeof在这里不适合使用。此外,正如其他人所指出的,字符数组的正确语法(正如您在代码中使用的那样)如下所示:

// empty character array
// cannot be changed or given a value
char text[];

// character array initialized to the length of its content
char text[] = "This is a string";

// character array with length 1000
// the elements may be individually manipulated using indices
char text[1000];

在你的情况下,我会做这样的事情:

#include <string.h>

void print(char text[]);

int main()
{
    char text[] = "This is a string";
    print(text);

    return 0
}

void print(char text[])
{
    // ALWAYS define a type for your variables
    int ch, len = strlen(text);

    for(ch = 0; ch < len; ch++) {
        do_something_with_character(text[ch]);
    }
}

标准库头string.h提供strlen函数,该函数返回字符串长度的整数值(实际上是无符号长整数),不包括终止NULL字符{ {1}}。在C中,字符串只是字符数组,指定字符串结尾的方式是在最后包含\0