问题一
我这样声明结构体有什么问题?
//申明一个结构体
struct book
{
char title[MAXTITL];//一个字符串表示的titile 题目 ;
char author[MAXAUTL];//一个字符串表示的author作者 ;
float value;//一个浮点型表示的value价格;
};//注意分号不能少,这也相当于一条语句;
答:
1.需要定义 MAXTITL
和 MAXAUTL
这两个宏来指定标题和作者名的最大长度。在 C 或 C++ 中,如果你使用了未定义的宏,编译器会将它们当作未定义的标识符处理,这可能会导致编译错误或者产生未预期的行为。
2.另外,为了保证代码的健壮性,你可能还需要在读取或设置 title
和 author
字段时进行边界检查,以避免超出数组范围的错误(即缓冲区溢出)。
3.最后,如果你是在函数外部声明这个结构体,通常会把结构体声明放在一个头文件(.h 文件)中,并且加上预处理器指令防止重复包含,例如:
#ifndef BOOK_H
#define BOOK_H
#define MAXTITL 100
#define MAXAUTL 50
struct book {
char title[MAXTITL];
char author[MAXAUTL];
float value;
};
#endif // BOOK_H
问题二
struct book xp;这条语句起什么作用?
struct book xp;
这条语句的作用是基于 struct book
结构体类型声明了一个名为 xp
的结构体变量。
在 C 或 C++ 编程语言中,当你定义了一个结构体类型后,你可以用它来创建具体的结构体变量。在这条语句中,xp
就是一个具体的 book
类型的结构体实例,它具有与 struct book
定义中相同的成员:title
、author
和 value
。
这意味着你可以通过 xp
变量来访问和操作
这些成员,例如:
// 初始化结构体变量
strcpy(xp.title, "C Programming");
strcpy(xp.author, "Brian W. Kernighan");
xp.value = 39.99;
// 打印结构体变量的内容
printf("Title: %s\n", xp.title);
printf("Author: %s\n", xp.author);
printf("Value: %.2f\n", xp.value);
面的代码首先初始化了 xp
结构体变量中的成员,然后打印出了这些成员的值。由于 xp
是一个具体的 book
类型的结构体变量,因此你可以像操作普通变量一样,通过点运算符(.
)来访问它的成员。
问题三
用char(*p)[100]给title赋值?
如果你想使用一个字符指针数组 char (*p)[100]
来给 struct book
中的 title
成员赋值,实际上你是在尝试将一个字符串数组的地址赋给 title
。但是,title
是一个普通的字符数组,不是指向数组的指针。因此,你不能直接将 p
赋值给 title
。
不过,你可以使用 strcpy()
函数或者直接的赋值操作(如果 p
指向的是一个有效的字符串)来拷贝字符串内容到 title
。这里有一个例子说明如何使用 char (*p)[100]
来初始化 struct book
的 三个成员:
#include <stdio.h>
#include <string.h>
#ifndef BOOK_H
#define BOOK_H
#define MAXTITL 100
#define MAXAUTL 50
struct book {
char title[MAXTITL];
char author[MAXAUTL];
float value;
};
#endif // BOOK_H
int main() {
struct book myBook;
// 初始化 title
char (*ptitle)[100] = (char (*)[100])&"The C Programming Language";
strcpy(myBook.title, *ptitle);
// 初始化 author
char (*pauthor)[50] = (char (*)[50])&"Brian W. Kernighan";
strcpy(myBook.author, *pauthor);
// 初始化 value
myBook.value = 39.99;
// 输出初始化后的信息
printf("Book Title: %s\n", myBook.title);
printf("Book Author: %s\n", myBook.author);
printf("Book Value: %.2f\n", myBook.value);
return 0;
}
但是,使用 char (*p)[N]
的方式来初始化字符串并不常见,也不推荐,因为这引入了额外的复杂性和潜在的错误。更简单和安全的方式是直接使用字符串字面量或通过其他方式初始化 struct book
的成员。例如:
#include <stdio.h>
#include <string.h>
#ifndef BOOK_H
#define BOOK_H
#define MAXTITL 100
#define MAXAUTL 50
struct book {
char title[MAXTITL];
char author[MAXAUTL];
float value;
};
#endif // BOOK_H
int main() {
struct book myBook;
// 直接使用字符串字面量初始化 title 和 author
strcpy(myBook.title, "The C Programming Language");
strcpy(myBook.author, "Brian W. Kernighan");
// 初始化 value
myBook.value = 39.99;
// 输出初始化后的信息
printf("Book Title: %s\n", myBook.title);
printf("Book Author: %s\n", myBook.author);
printf("Book Value: %.2f\n", myBook.value);
return 0;
}
或者,你可以在声明 struct book
变量时直接初始化:
int main() {
struct book myBook = {"The C Programming Language", "Brian W. Kernighan", 39.99};
// 输出初始化后的信息
printf("Book Title: %s\n", myBook.title);
printf("Book Author: %s\n", myBook.author);
printf("Book Value: %.2f\n", myBook.value);
return 0;
}
问题四
如果没有声明结构体的标签 book ,会怎么样?
当我们定义一个结构体而不使用类型标签时,我们可以立即使用它来创建一个变量,但之后我们无法再创建相同类型的其他变量,除非再次定义整个结构体。 下面是一个示例,展示了如何定义一个没有类型标签的结构体,并立即创建一个变量:
#include <stdio.h>
int main() {
// 定义一个匿名结构体并立即创建一个变量
struct {
int x;
int y;
} point;
// 初始化结构体变量
point.x = 10;
point.y = 20;
// 输出结构体变量的内容
printf("Point: (%d, %d)\n", point.x, point.y);
return 0;
}
然而,如果我们试图在其他地方再次使用相同的结构体类型,我们会发现这是不可能的,因为我们没有为其定义一个类型标签。例如,如果我们尝试创建第二个相同的结构体变量,代码如下所示,它是无效的:
// 错误的示例,尝试使用未命名的结构体类型创建新变量
struct {
int x;
int y;
} point2; // 这将创建一个新的结构体变量,但它不是一个类型,因此不能再次使用
为了能够创建多个相同类型的变量,我们需要为结构体定义一个类型标签,或者使用 typedef
来创建一个类型别名。
#include <stdio.h>
// 使用 typedef 创建类型别名
typedef struct {
int x;
int y;
} Point;
int main() {
Point point1 = {10, 20};
Point point2 = {30, 40};
printf("Point1: (%d, %d)\n", point1.x, point1.y);
printf("Point2: (%d, %d)\n", point2.x, point2.y);
return 0;
}
在这段代码,point1的类型是Point。结构体别名就是结构体变量(不是成员)的类型名。
问题五
在这段结构体相关的代码中input函数的形参是什么?
#include <stdio.h>
struct Time
{
int hour;
};
void input(struct Time *t)//意思是t是一个结构体指针,即传过来的tt的地址用t表示
{
scanf("%d",&t->hour);//也可写为scanf("%d",&(*t).hour)
}
int main()
{
struct Time tt={5};
printf("Time input num:\n");
input(&tt);//给分函数的形式参数是地址
printf("Time:%d\n",tt.hour);
}