C-关于字符串的预处理器声明
所以我有一个小程序,是从课本上打出来的C-关于字符串的预处理器声明,c,string,preprocessor,C,String,Preprocessor,所以我有一个小程序,是从课本上打出来的 #include <stdio.h> #define string char* int main(void) { string a[] = { "I", "like", "to", "fight," }, b[] = {"pinch,","and","bite."}; printf("%s %s %s %s %s %s %s\n", a[0], a[1], a[2], a[3], b[0], b[1], b[2]
#include <stdio.h>
#define string char*
int main(void) {
string a[] = { "I", "like", "to", "fight," },
b[] = {"pinch,","and","bite."};
printf("%s %s %s %s %s %s %s\n", a[0], a[1], a[2], a[3], b[0], b[1], b[2]);
return 0;
}
显然,我们的目标是让这项工作发挥作用。这本书暗示,在#define
预处理器中,可以添加一个字符使其工作。而且,由于错误都集中在b
字符串上,我认为应该是b
。但事实并非如此。要么这样,要么我把b
放错位置了。我对这个问题的理解是,虽然它为a字符串创建了足够的空间,但它不是为b
字符串创建的
如果您有任何意见,我们将不胜感激。好的,如果您有
int *a, b;
您可能很快就会看到您有一个int指针和一个int。代码中也发生了同样的情况
string a[] = { "I", "like", "to", "fight," },
b[] = {"pinch,","and","bite."};
变成
char* a[] = { "I", "like", "to", "fight," },
b[] = {"pinch,","and","bite."};
所以你有一个字符指针数组和一个字符数组。您需要添加的单个字符是*
,以使b
成为一个字符指针数组
char* a[] = { "I", "like", "to", "fight," },
*b[] = {"pinch,","and","bite."};
好吧,如果你有
int *a, b;
您可能很快就会看到您有一个int指针和一个int。代码中也发生了同样的情况
string a[] = { "I", "like", "to", "fight," },
b[] = {"pinch,","and","bite."};
变成
char* a[] = { "I", "like", "to", "fight," },
b[] = {"pinch,","and","bite."};
所以你有一个字符指针数组和一个字符数组。您需要添加的单个字符是*
,以使b
成为一个字符指针数组
char* a[] = { "I", "like", "to", "fight," },
*b[] = {"pinch,","and","bite."};
您的代码扩展为
char*a[]={…},b[]={…}代码>。b
前面缺少一个星号(缺少的字符)。为什么不使用typedef
?通过预处理器定义类型总是一个坏主意。我认为这会使a
的类型char*[]
和b
的类型char[]
。有趣的是,你问,原始代码实际上使用了typedef,但指令要求删除它,并将字符串的声明移动到预处理器中。就个人而言,我不喜欢在这种情况下使用#define,但这正是本书想要的。也许作业想让你学到这一课?就我个人而言,我不喜欢使用逗号运算符,部分原因是这样的。做char*a,b
有点误导,因为*
绑定到a
,而不是b
(即char*a;char b;
)。虽然char*
已经成为一种常见的习惯用法,但它实际上是作为char*
来使用的。最好定义为char*
。执行*b
来修复它有点违背了#define
的目的,所以请使用typedef或拼写出来。此外,我从不在声明中使用逗号运算符来避免这种[难以看到的]歧义。实际上,将声明分开[在单独的行上]更为简洁代码>。b
前面缺少一个星号(缺少的字符)。为什么不使用typedef
?通过预处理器定义类型总是一个坏主意。我认为这会使a
的类型char*[]
和b
的类型char[]
。有趣的是,你问,原始代码实际上使用了typedef,但指令要求删除它,并将字符串的声明移动到预处理器中。就个人而言,我不喜欢在这种情况下使用#define,但这正是本书想要的。也许作业想让你学到这一课?就我个人而言,我不喜欢使用逗号运算符,部分原因是这样的。做char*a,b
有点误导,因为*
绑定到a
,而不是b
(即char*a;char b;
)。虽然char*
已经成为一种常见的习惯用法,但它实际上是作为char*
来使用的。最好定义为char*
。执行*b
来修复它有点违背了#define
的目的,所以请使用typedef或拼写出来。此外,我从不在声明中使用逗号运算符来避免这种[难以看到的]歧义。实际上,将声明分开(在单独的行上)更干净。我明白了,这是有道理的。我得到了隧道视觉,并认为它将在预处理器,但是的,这是有意义的。非常感谢。我明白了,这是有道理的。我得到了隧道视觉,并认为它将在预处理器,但是的,这是有意义的。非常感谢。