【PTA选择题/基础夯实/期末复习】结构体(一)

文章详细分析了C语言中scanf函数在处理结构体变量、数组和指针时的正确用法和常见错误,包括结构体数组的访问方式,以及如何正确引用嵌套结构的成员。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.xyz都是结构成员名

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.years.birth.months.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的前缀。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值