错题集

1.以下哪个定义中的p不是指针,请选择恰当的选项;(C)
A. char **p;
B. char (p)[10];
C. char (
)p[6];
D. 给出的三项中,p都是指针
解析:内存区的每一个字节有一个编号,这就是“地址”。通过地址能找到所需的变量单元,可以说,地址指向该变量单元。可将地址形象化地称为“指针”。
1.char ()p[6]:指针数组–>指针数组中的每一元素都存放一个地址,相当于一个指针变量。[]的优先级比高,因此 p先与[6]结合,表示p数组有四个元素。再与p前面的“*”结合,表示该数组是指针类型。数组元素 才是指针。 指针数组适合用来指向若干个字符串。
2.char(*p)[10]:数组指针–>其相当于char p[][10].p是一个指针,指向一个字符型的一维数组,亦称行数组。
3.char **p:多重数组–>定义为指向指针数据的指针变量。char *(*p)

2.以下不正确的赋值或赋初值的方式是 (D)
A. char str[]=“string”;
B. char str[7]={‘s’, ‘t’, ‘r’, ‘i’, ‘n’, ‘g’};(系统自动添加‘\0’)
C. char str[10];str=“string”;
D. char str[7]={‘s’, ‘t’, ‘r’, ‘i’, ‘n’, ‘g’, ’\0’};(自己手动添加‘\0’)
解析:字符串赋值–>1.定义时直接用字符串赋值,如.A;
2.注意(1)不能先定义再给它赋值,(2)不能直接把字符串 赋值给数组名(也就是数组首元素的首地址,是一个常量)是不行的,如.C;
3.对数组中的字符 逐个赋值,如.B,也可以以D的形式;
4.利用strcpy函数
5.利用指针,char *p=“hello”;---->char *p;p=“hello”; (将字符串的第一个元素的地址赋给字符指针变量P)printf("p=%s",p);在使用指针的时候,指针可以自增,而数组名不能自增编译器数组分配了空间。在指针自增的时候,编译器会自动识别类型,比如指针是指向int型的,想获取下一个的地址时,指针直接p++就行了,不要多此一举的p+4了。在void指针使用的时候,不能 使用指针运算,因为void型编译器不能识别类型的长度(即指针所指对象的体积),p++这样是 不合法的,即不能进行数学运算,也不能使用取值操作,想使用必须转换为其它的类型。

3.假设scanf语句执行时输入ABCDE<回车>,能使puts(s)语句正确输出ABCDE字符串的程序段是_D_。
A. char s[5]={“ABCDE”}; puts(s);–>结果最后一位乱码。
B. char s[5]={‘A’, ‘B’, ‘C’, ‘D’, ‘E’}; puts(s);–>结果最后一位乱码。
C. char *s; scanf("%s", s); puts(s);–>程序的错误在于你定义了一个字符串指针,但是你没有分配空间.需将char *s改为char s[20].
D. char *s; s=“ABCDE”; puts(s);
解析:A.与B.都存在数组越界问题,都应改为char s[6].

4.对于定义 char str[] = “abc\000def\n”(注:其中0为数字零),求字符串str的长度len和数组str的大小size,len和size分别是:C
A.12 ,13
B. 3 ,11
C. 3 ,9
D. 3 ,4
解析:\000-\077表示八进制的一个字符; \080-\099表示\0+2个字符的三个字符
char a[]=“123\088abcde”;strlen=3,sizeof=12;
char a[]=“123\077abcde”;strlen=9,sizeof=10;
strlen函数,其值为字符串的实际长度(不包括‘\0’在内),strlen计算的是字符串到’\0’位置的大小。
sizeof求的是字符串在内存中的长度,所以它是加上最后的’\0’的,sizeof计算的字符串占的内存大小。

5.选项(A、B、C、D )与以下字符数组定义等价。
static char s[6] = {‘H’, ‘a’, ‘p’, ‘p’, ‘y’, ‘\0’};
A.static char s[6] = {‘H’, ‘a’, ‘p’, ‘p’, ‘y’};---->表示定义一个含有六个元素的字符数组,它的元素是字符。strlen(s)=5
B.static char s[6] =“Happy”;----> 表示定义一个字符串常量。与int a = 2一样理解就可以了。还有一种形式就是a = “happy”。strlen(s)=5
C.static char s[6] ={“Happy”};---->表示定义一个含有一个元素的字符串数组,它的元素是字符串。strlen(s)=5
D.static char s[6] = {‘H’, ‘a’, ‘p’, ‘p’, ‘y’, 0};---->0相当\0;strlen(s)=5
解析:char s[]={‘H’, ‘a’, ‘p’, ‘p’, ‘y’};因为不以\0结尾,strlen(s)不确定。
char s[] =“Happy”;为字符串,因为最后一个字符串结束符\0不计入长度,所以strlen(s)=5。

6.若有定义char str[]={“Python”, “SQL”, “JAVA”, “PHP”, “C++”}; 则表达式str[1] > *str[3]比较的是:(D)
A.字符P和字符J
B.字符串SQL和字符串PHP
C.字符串Python和字符串JAVA
D.字符S和字符P
解析:比较的是每一字符串的首元素.将字符串的第一个元素的地址赋给字符指针变量.

7.指向数组元素的指针只可指向数组的首元素。(错)

8.一维数组定义的一般形式如下,其中的类型名指定***数组变量***的类型。(错)
类型名 数组名[数组长度];

9.一维数组定义的一般形式如下,其中的类型名指定***数组中每个元素***的类型。(对)
类型名 数组名[数组长度];
解析:在判断8.与9.时,要区别开数组变量和数组的每一个元素。

10.数组定义后,只能引用单个的数组元素,而不能一次引用整个数组。(错)
解析:在引用字符串时,就可以。

11.以下定义了一个一维数组str,该数组可以存放81个字符型数据。(对)
char str[81];
解析:包括’\0’。

12.如果变量定义如下,则正确的语句是( E)。
int i, j, tab[3][4];
A.tab[0][ ] = 0;
B.tab[ ][3] = 3;
C.tab = 100;
D.for(i = 1; i <= 3; i++){
for(j = 1; i <= 4; j++){
scanf(“%d ”, &a[i][j];
}
}
E.for(i = 0; i < 3; i++){
for(j = 0; j < 4; j++){
printf("%4d", tab[i][j]);
}
printf("\n");
}
解析:D错在i<=4.

13.数组定义为 int a[3][2]={1, 2, 3, 4, 5, 6},数组元素__B__的值为6。
A.a[3][2]
B.a[2][1]
C.a[1][2]
D.a[2][3]
解析:错选C,把行和列看错了,应仔细注意。
… [0][1]
a[0]1, 2,
a[1]3, 4, ------->(!!错误!!) 1,2,3 4,5,6
a[2]5, 6,

14.在以下描述中,(A、C)是正确的。
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。------>10个数组元素的初值都是不确定的
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]值都是不确定的。------>week[3]~week[6]值都是0.

15.在以下描述中,(A、B、C、D )是正确的。
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,而其余元素的值都是不确定的。

16.字符串复制。
以下程序段的功能是:将字符串str1的内容复制到字符串str2。

int i;
char str1[81], str2[81];
i = 0;
while (str1[i] != '\0')//若str1[i]的值不等于‘\0’,即未输完str1的值,就进行循环
 {
	str2[i] = str1[i];//将 str1的值赋给str2中
        i++;
 }
str2[i]='\0';//直到str2[i]的值等于‘\0’,即赋完str2的值,就结束

17.大小写字母转换。
以下程序段A和B的功能都是:将字符串中的小写字母全部转换成大写字母,大写字母全部转换成小写字母,其他字符不变。
/* 程序段A */

int k;
char str1[81];
k = 0;
while (str1[k] != '\0') {
    if (str1[k] >= 'a' && str1[k] <= 'z'){       
	str1[k] = str1[k]-'a'+'A';//小写变大写
    }
    else if (str1[k] >= 'A' && str1[k] <= 'Z'){
        str1[k] = str1[k]-'A'+'a';//大写变小写
    }
    k++;
}

/* 程序段B */

    int k;
    char str1[81], str2[81];
    k = 0;
    while (str1[k]!='\0') {
        if (str1[k]>='a' && str1[k]<='z'){
            str2[k] = str1[k]-'a'+'A';//小写变大写
     }
        else if (str1[k]>='A' && str1[k]<='Z'){
            str2[k] = str1[k]-'A'+'a';//大写变小写
     }
        else{
            str2[k] = str1[k];//若不是字母,就保持不变
	    }
        k++;
     }
    str2[k] = '\0';

18.冒泡法排序:
本题要求将给定的n个整数从小到大排序后输出。输出时相邻数字中间用一个空格分开,行末不得有多余空格。

#include <stdio.h>
# define MAXN 10
int main()
{
    int i, index, j, n, repeat, temp;
    int a[MAXN];
    for(repeat = 1; repeat <= 4; repeat++){
        scanf("%d", &n);
        for(i = 0; i < n; i++){
            scanf("%d", &a[i]);
        }

        for( i = 1; i < n; i++ ){
            for(j = 0; j < n-i; j++ ) 
           {
                if (a[j] > a[j+1])//判断数值大小
              { 
                  temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; //利用第三变量交换

               }
            }
        }

       for(i = 0; i < n; i++) 
      {
            if (i == 0)//避免第一个数前有空格
	    {
                printf("%d", a[i]);
            }else
	   {
                printf(" %d", a[i]);//注意每一个数前有一个空格

            }
        }
        printf("\n");

    }

    return 0;
}

19.选择法排序:
本题要求将给定的n个整数从小到大排序后输出。输出时相邻数字中间用一个空格分开,行末不得有多余空格。

#include <stdio.h>
# define MAXN 10 int main() {
    int i, index, k, n, temp;
    int a[MAXN];
    scanf("%d", &n);
    for(i = 0; i < n; i++){
        scanf("%d", &a[i]);
    }

    for(k = 0; k < n-1; k++){
        index = k;  //利用下标,设一个擂主
        for(i = k + 1; i < n; i++)
        {
            if(a[i] < a[index])
           {
                index = i;  
            }    
        }  
        temp = a[index];  a[index] = a[k]; a[k] = temp;//利用第三变量交换
    }
    for(i = 0; i < n; i++) {
        if(i == 0)//避免第一个数前有空格
       {
            printf("%d", a[i]);
        }else{
            printf(" %d", a[i]);
        }
    }
    printf("\n");
    return 0; }

20
该函数为计算字符串中数字

#include<stdio.h>
#include<string.h>
int main()
{
   char s[80];
   static int count[10];
   int i;
   scanf("%s", s);
   for(i=0;i<strlen(s);i++)
	   if(s[i]>='0'&&s[i]<='9') //判断字符是否为数字
               count[s[i]-'0']++;
   for(i=0;i<10;i++)
	 printf("%d",count[i]);
   return  0;

21.文件指针和位置指针都是随着文件的读写操作在不断改变。(错)
解析:文件指针不变

22.以“a”方式打开一个文件时,文件指针指向文件首。(错)
解析:指向文件末尾。

23.从文件的逻辑结构上看,c语言把文件看作数据流,并将数据按顺序以一维方式组织存储。(对)
解析:区别物理结构和逻辑结构。物理结构是数据结构在计算机中的表示(映像)称为数据的物理(存储)结构。存放不一定线性,而逻辑结构一定线性。

24.文件指针指向文件缓冲区中文件数据的存取位置。(错)
解析:指向—>文件在缓冲区上的读写位置

25.定义FILE *fp; 则文件指针fp 指向的是(B)。
A.文件在磁盘上的读写位置
B.文件在缓冲区上的读写位置
C.整个磁盘文件
D.文件类型结构体
解析:fp是一个指向FILE类型数据的指针变量。可以使fp指向某一个文件的文件信息区,通过该文件信息区的信息就能访问该文件。

26.利用函数fseek可实现的操作是(D)。
A.改变文件指针fp的值
B.文件的顺序读写
C.文件的随机读写
D.以上答案均正确
解析: (起始点)
文件开始位置----->0;
文件当前位置----->1;
文件末位位置----->2;
fseek(文件类型指针,位移量,起始点)

27.函数fgetc的作用是从指定文件读入一个字符,该文件的打开方式必须是(D)。
A.只写
B.追加
C.读或读写
D.答案B和C都正确
解析:追加a–>向文本文件尾添加数据,不覆盖原文件。

28.fputc(ch,fp) 把一个字符ch写到fp所指示的磁盘文件中,若写文件失败则函数的返回值为(C )。
A.0
B.1
C.EOF
D.非0
解析:fgetc()、fputc()失败,则返回EOF(-1);
fgets()失败,则返回NULL;
fputs()失败,则返回非0值;

29.按存储介质划分,文件可以分为:(B)
A.记录文件和流式文件
B.普通文件和设备文件
C.文本文件和二进制文件
D.程序文件和数据文件

30.按数据的组织形式划分,文件可以分为:(C)
A.记录文件和流式文件
B.普通文件和设备文件
C.文本文件和二进制文件
D.程序文件和数据文件

  • 8
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值