Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-关于字符串的预处理器声明_C_String_Preprocessor - Fatal编程技术网

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或拼写出来。此外,我从不在声明中使用逗号运算符来避免这种[难以看到的]歧义。实际上,将声明分开(在单独的行上)更干净。我明白了,这是有道理的。我得到了隧道视觉,并认为它将在预处理器,但是的,这是有意义的。非常感谢。我明白了,这是有道理的。我得到了隧道视觉,并认为它将在预处理器,但是的,这是有意义的。非常感谢。