我正在尝试编写一个函数,用于在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");
我收到关于错误括号的编译器投诉。
这有什么问题?
在这种情况下如何使用char数组指针?
答案 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
。