2-1
以下scanf
函数调用语句中不正确的是__。
struct pupil {
char name[20];
int age;
int sex;
} pup[5], *p=pup;
A.scanf("%s", pup[0].name);
B.scanf("%d", &pup[0].age);
C.scanf("%d", p->age);
D.scanf("%d", &(p->sex));
2-2
有如下定义:
struct Student{
char name[10];
int age;
char gender;
}std[3], *p=std;
则以下各输入语句中错误的是:
A.scanf("%d",&(*p).age);
B.scanf("%c",&std[0].gender);
C.scanf("%c",&(p->gender));
D.scanf("%s",&std.name);
解析:
std
是一个结构体数组,无法直接使用点号操作符来访问整个结构体数组的成员。应该使用 std[0].name
或者 p->name
来访问结构体数组中第一个元素的 name
成员。
2-3
下面定义结构变量的语句中错误的是()。
A.struct student{ int num; char name[20]; } s;
B.struct { int num; char name[20]; } s;
C.struct student{ int num; char name[20]; }; struct student s;
D.struct student{ int num; char name[20]; }; student s;
2-4
根据下面的定义,能打印出字母M的语句是()。
struct person{
char name[10];
int age;
} c[10] = { “John”, 17, “Paul”, 19, “Mary”, 18, “Adam”, 16 };
A.printf(“%c”, c[3].name);
B.printf(“%c”, c[3].name[1]);
C.printf(“%c”, c[2].name[0]);
D.printf(“%c”, c[2].name[1]);
2-5
对于以下结构定义,(*p)->str++中的++加在()。
struct { int len; char *str; } *p;
A.指针str上
B.指针p上
C.str指向的内容上
D.语法错误
解析:
(*p)->str++
是无效的语法。
首先,(*p)
解引用指针 p
,得到了一个结构体对象。然后,使用箭头运算符 ->
访问结构体成员 str
,但 str
是一个指针。
在 C 语言中,对指针应用 ++
运算符是无效的,因为指针的类型决定了它所指向内存位置的大小。而指针 str
的类型是 char*
,其指向的内存位置大小为一个字符,无法进行递增操作。
因此,(*p)->str++
是语法错误的。
若为p->str++,的确时加在指针str上;而本题为(*p)->str,则会发生语法错误
2-6
若程序有以下的说明和定义:
struct abc { int x;char y; } struct abc s1,s2;
则会发生的情况是()
A.编译时错
B.程序将顺序编译、连接、执行
C.能顺序通过编译、连接、但不能执行
D.能顺序通过编译、但连接出错
2-7
若有以下语句,则下面表达式的值为1002的是()。
struct student
{int age;
int num;};
struct student stu[3]={{1001,20},{1002,19},{1003,2}};
struct student *p;
p=stu;
A.(p++)->num
B.(p++)->age
C.(*p).num
D.(*++p).age
2-8
有以下程序
#include <stdio.h>
struct S
{
int a,b;
}data[2]={10,100,20,200};
main()
{
struct S p=data[1];
printf("%d\n",++(p.a));
}
程序运行后的输出结果是()
A.20
B.21
C.10
D.11
2-9
定义如下结构体:
struct sk
{
int a;
float b;
}data, *p;
若指针p指向结构体变量data,即有p = &data; ,则对结构体成员a的正确引用是____。
A.(*p).data.a
B.(*p).a
C.p->data.a
D.p.data.a
2-10
以下程序运行后的输出结果是____。
#include<stdio.h>
struct s
{
int x;
int y;
} data[2] = {10, 100, 20, 200};
int main()
{
struct s *p = data + 1;
printf("%d\n", p->x);
return 0;
}
A.10
B.11
C.20
D.21
2-11
设有如下定义
struct ss
{
char name[10];
int age;
char sex;
}std[3],*p=std;
下列各输入语句中错误的是____。
A.scanf("%d", &(*p).age);
B.scanf("%s", &std.name);
C.scanf("%c", &std[0].sex);
D.scanf("%c", &(p->sex));
2-12
对于以下定义,不正确的叙述是( )。
struct ex {
int x;
float y;
char z ;
} example;
A.struct
是定义结构类型的关键字
B.example
是结构类型名
C.x
, y
, z
都是结构成员名
D.struct ex
是结构类型名
2-13
以下程序段的输出结果为( )。
struct {
int x;
int y;
} s[2] = { { 1, 3 }, { 2, 7 } };
printf("%d", s[0].y/s[1].x );
A.0
B.1
C.2
D.3
2-14
对于以下定义,错误的scanf函数调用语句是()。
struct pupil{
char name[20];
int age;
int sex;
}pup[5];
A.scanf("%s", &pup[0].name);
B.scanf("%d", &pup[1].age);
C.scanf("%d", &pup[2].sex);
D.scanf("%s", pup[4].name);
2-15
设有如下定义,则错误的输入语句是( )。
struct ss{
char name[10];
int age;
char sex;
} std[3], *p = std;
A.scanf("%d", &(*p).age);
B.scanf("%d", p->&age);
C.scanf("%c", &std[0].sex);
D.scanf("%c", &(p->sex));
2-16
如果结构变量s中的生日是“1984年11月11日”,下列对其生日的正确赋值是()。
struct student
{
int no;
char name[20];
char sex;
struct{
int year;
int month;
int day;
}birth;
};
struct student s;
A.year = 1984; month = 11; day = 11;
B.birth.year = 1984; birth.month = 11; birth.day = 11;
C.s.year = 1984; s.month = 11; s.day = 11;
D.s.birth.year = 1984; s.birth.month = 11; s.birth.day=11;
解析:
D. s.birth.year = 1984; s.birth.month = 11; s.birth.day = 11;
这是因为结构变量s的生日信息是嵌套在一个匿名结构中的。要访问这个嵌套结构的成员,我们需要使用结构变量s后面跟着.
操作符,然后再接上嵌套结构的成员名。
所以,正确的方式是使用 s.birth.year
、s.birth.month
和 s.birth.day
来分别赋值年、月和日。
选项 D. s.birth.year = 1984; s.birth.month = 11; s.birth.day=11; 是对结构变量s的生日进行正确赋值的。请注意,选项 B. birth.year = 1984; birth.month = 11; birth.day = 11; 是错误的,因为它缺少了结构变量s的前缀。