错题记录

这篇博客详细解析了C语言中字符串函数strcmp的工作原理和使用误区,以及数组的相关概念,包括数组名的含义、二维数组的表示及操作、数组的初始化规则。此外,还讨论了指针与数组的关系,如指针常量与常量指针的区别,并介绍了链表、文件操作等基础知识。

选择题
1、函数strcmp从头至尾顺序地将其对应字符比较,遇到两个字符不等时,两个字符相减得到一个int型值,两个字符串完全相同时,则返回0。(正确)
2、如果strcmp(s1,s2)返回的结果为0,表示字符串s1和s2不相同。(错误)
解析:
字符串的比较规则是:将两个字符串自左向右逐个字符比较(按ASCII码值大小比较),直到出现不同的字符或遇到‘\0’为止。如果字符串1、2相同,则函数值为0。如果字符串1〉字符串2,则函数值为一个正整数。
如果字符串1〈字符串2,则函数值为一个负整数。
3、对于已正确定义的二维数组a, *(a[i]+j)与a[i][j]的含义相同。(正确)
解析:
a[i][j]表示i行第j列的值,**(a[i]+j)也表示第i行第j列的值,只是二者写法不同。
4、数组名就是一个指针常量,指向数组的首元素(或者说代表了数组的首地址)。(错误)
解析:
数组名是一个常量指针
(1)指针常量——指针类型的常量(int *const p) 本质上一个常量,指针用来说明常量的类型,表示该常量是一个指针类型的常量。在指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址。在定义的同时必须初始化。
(2)常量指针——指向“常量”的指针(const int *p, int const *p) 常量指针本质上是一个指针,常量表示指针指向的内容,说明该指针指向一个“常量”。在常量指针中,指针指向的内容是不可改变的,指针看起来好像指向了一个常量。
5、假设有定义如下: int array[10]; 则该语句定义了一个数组array。其中array的类型是整型指针(即: int *)。(错误)
解析:
array是指向int array[0]的地址的指针
6、一维数组定义的一般形式如下,其中的类型名指定数组变量的类型。
类型名 数组名[数组长度];
解析:
其中的类型名指定数组中每个元素的类型。
7、数组定义后,只能引用单个的数组元素,而不能一次引用整个数组。(正确)
8、一维数组初始化的一般形式如下,即在定义数组时,对数组元素赋初值。其中初值表中依次放着数组元素的初值。
类型名 数组名[数组长度] = {初值表};(正确)
9、有说明语句int a[4][5];,则a[2]+3表示__。 (2分)
A、a数组行下标为2、列下标为3的元素的地址
B、a数组行下标为2、列下标为3的元素的值
C、a数组第2行的首地址
D、a数组第3行的首地址
正确答案:A
10、以下哪个定义中的p不是指针,请选择恰当的选项: (2分)
A、char **p;
B、char (*p)[10];
C、char [6];
D、给出的三项中,p都是指针
正确答案:C
解析:
C答案中是指针数组,数组中的每个元素才是指针,p不是指针
11、若有定义char str[]={“Python”, “SQL”, “JAVA”, “PHP”, “C++”}; 则表达式str[1] > *str[3]比较的是:(2分)
A、字符P和字符J
B、字符串SQL和字符串PHP
C、字符串Python和字符串JAVA
D、字符S和字符P
正确答案:D
错因:没有注意到数组名前的星号
12、如果变量定义如下,则正确的语句是( )。 (1分)

int k, a[10];

A、a[-1] = -1;

B、a[0] = 23;

C、k = 3; a[k - 2] = a[9] + 1;

D、for(k = 1; k <= 10; k++){
printf(“%d ”, a[k]);
}

E、for(k = 0; k < 10; k++){
scanf(“%d ”, &a[k]);
}
正确答案:BCE
解析:
13、在以下描述中,( )是正确的。 (1分)
A、int a[5] = {1, 2, 3, 4, 5};
定义了数组a,并对数组元素赋初值。此时,a[0]为1,a[1]为2,a[2]为3,a[3]为4,a[4]为5。

B、static int b[10];
定义了静态数组b,且10个数组元素的初值都为0。

C、int fib[45] = {1, 1};
定义了数组fib,并对数组 fib 的前2个元素赋初值,其余元素的值都为0。

D、static int week[7] = {1, 2, 3};
定义了静态数组week,并对数组 week 的前3个元素week[0]~week[2]赋初值,week[3]~week[6]值都是不确定的。
正确答案:AB
14、在以下描述中,( )是正确的。 (1分)
A、int a[3][3] = {1};
定义了数组a,并对数组a赋初值。此时,a[0][0]的值为1,而其余元素的值都是不确定的。

B、static int b[4][3] = {{ }, { }, { },{9}};
定义了静态数组b,并对数组赋初值。此时,b[3][0]的值为9,而其余元素的值都为0。

C、int a[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
等价。

D、static int b[4][3] = {{1, 2, 3}, { }, {4, 5}};

static int b[4][3] = {1, 2, 3, 0, 0, 0, 4, 5};
等价。

E、int a[3][3] = {{},{4},{}};
定义了数组a,并对数组a赋初值。此时,a[1][1]的值为4,而其余元素的值都是不确定的。
正确答案:ABCD
15、选项( )与以下字符数组定义等价。 (1分)
A、static char s[6] = {‘H’, ‘a’, ‘p’, ‘p’, ‘y’, ‘\0’};

B、static char s[6] = {‘H’, ‘a’, ‘p’, ‘p’, ‘y’};

C、static char s[6] =“Happy”;

D、static char s[6] ={“Happy”};

E、static char s[6] = {‘H’, ‘a’, ‘p’, ‘p’, ‘y’, 0};
正确答案:ABCD
16、数组初始化时,初始值个数小于数组元素的个数,C语言自动将剩余的元素初始化为初始化列表中的最后一个初始值。(错误)
解析:
当初始值大于数组元素的个数时,系统会自动给后面的元素赋初值0;
当初始值小于数组元素的个数时,则出现语法错误。
17、对于定义int a[5];可以通过语句scanf("%d",a);输入全部元素的值。 (错误)
解析:
正确输入语句为scanf("%d",&a[5]);
若为字符数组char a[5];scanf("%s",a);
18、int x[]={1,2,3},*p=x,y;
则y=p++;
相当于(D)
A、y=1,x++
B、y=2,p=x+1
C、y=
(p+1),p=p+1
D、y=*p,p++
20、对于如下定义
int k,a[10],*p=a;
哪个表达式是不正确的(B)
A、a[0]=k
B、a++
C、p++
D、p[0]=k
解析:
a为数组名,不能更改
21、单向链表中的每个结点都需要动态分配内存空间。 (正确)
22、在单向链表中,头指针中存放的是头结点的内容。(错误)
解析:
单向链表中往往含有一个头结点,该结点不存储数据元素,一般令链表的头指针指向该结点,而该结点指针域的值为第一个元素结点的指针。
23、链表不具有的特点是(B)。 (2分)
A、插入、删除不需要移动元素
B、可随机访问任一元素
C、不必事先估计存储空间
D、所需空间与线性长度成正比
24、关于单向链表说法不正确的是: (2分)
A、与数据相比,单向链表适合反复进行删除、插入操作
B、存储空间可以动态的获取和释放
C、结点的存储空间分两部分,一部分用于存储结点的数据,另一部分用于存储其他结点的指针
D、单向链表在内存中是连续存储的
25、随机操作只适用于文本文件。 (错误)
解析:
随机操作适用于文本文件和二进制文件
26、文件的读函数是从输入文件中读取信息,并存放在内存中。(正确)
27、从文件的逻辑结构上看,c语言把文件看作数据流,并将数据按顺序以一维方式组织存储。 (正确)
28、c语言源程序是文本文件,目标文件和可执行文件是二进制文件。(正确)
29、对于缓冲文件系统,在进行文件操作时,系统自动为每一个文件分配一块文件内存缓冲区(内存单元)。(正确)
30、C系统的标准输出文件stdout是指显示器。(正确)
31、当fopen函数打开文件失败时,返回给文件指针的值是NULL。(正确)

实现错题记录功能,可以使用文件操作来存储和读取错题信息。以下是一个简单的 C 语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 // 最大错题数 // 定义结构体存储错题信息 typedef struct { int question_num; // 题号 char question[100]; // 题目 char answer[100]; // 答案 char explanation[200]; // 解释 } Question; // 存储错题信息到文件 void save(Question* questions, int size, char* file_name) { FILE* fp; fp = fopen(file_name, "w"); if(fp == NULL) { printf("无法打开文件\n"); exit(1); } for(int i = 0; i < size; i++) { fprintf(fp, "%d %s %s %s\n", questions[i].question_num, questions[i].question, questions[i].answer, questions[i].explanation); } fclose(fp); } // 从文件中读取错题信息 void load(Question* questions, int* size, char* file_name) { FILE* fp; fp = fopen(file_name, "r"); if(fp == NULL) { printf("无法打开文件\n"); exit(1); } int i = 0; while(fscanf(fp, "%d %[^\n] %[^\n] %[^\n]\n", &questions[i].question_num, questions[i].question, questions[i].answer, questions[i].explanation) != EOF) { i++; } *size = i; fclose(fp); } int main() { Question questions[MAX_SIZE]; int size = 0; // 读取文件中的错题信息 load(questions, &size, "questions.txt"); // 在此处添加代码,实现错题记录功能 // 存储错题信息到文件 save(questions, size, "questions.txt"); return 0; } ``` 在上述代码中,我们定义一个 `Question` 结构体来存储每一道错题的信息。`save` 函数将错题信息存储到文件中,`load` 函数从文件中读取错题信息。你可以在 `main` 函数中添加代码来实现错题记录功能,比如让用户输入题目和答案,将输入的信息存储到结构体数组中。最后,调用 `save` 函数将更新后的错题信息存储到文件中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值