第7章 字符串
7.1 典型考试题剖析
7.1.1 选择题:
【例1若有以下定义:char s[20]"progrmming"*ps=s;则不能代表字符o的表达式是_______
A)  ps+2    B)  s[2]          C)  ps[2]        D)  ps+=2,*ps
        考点:指向字符串的指针
        分析:ps是一个指针,加上一个整型数据后仍然是一个指针,ps+2表示的是'o'的地址,而不是字符o
        答案:A
【例2以下选项中,不能正确赋值的是________
A) char s1[10];s1=="Ctest";
B) char s2[ ]={'C','t','e','s','t'};
C) char s3[20]="Ctest";
D) char *s4="Ctest\n";
        考点:本例考查字符数组和字符串的初始化方法
        分析:注意A选项的错误是非常典型的错误,错误之处就在于,数组名是一个地址常量,给常量赋值是不合语法的,所以给数组名赋值是非法的操作。选项B是一个合法的字符数组初始化形式,但注意s2不构成字符串,因为数组s2中没有字符串结束符。
        答案:A
【例3下列描述中不正确的是__________
A) 字符型数组中可以存放字符串
B) 可以对字符型数组进行整体输入、输出
C) 可以对整型数组进行整体输入、输出
D) 不能在赋值语句中通过赋值运算符“=”对字符型数组进行整体赋值
        考点:本例考查字符数组和字符串的基本概念。
        分析:字符型数组中可以存放字符串,所以A是正确的。如果字符型数组中存放的是字符串,则可以对其进行整体输入输出,所以B也是正确的。但除了构成字符串的字符数组以外,其他数组是不能进行整体输入、输出的,所以C错误。对字符型数组不能用“=”整体赋值,char s[ ]=”Hello”;这种形式称为“初始化”而不叫赋值语句。
        答案:C
【例4对于以下字符串,说明表达式strlen(s)的值。
1.char s[10]={‘a’,’\0’,’b’,’c’,’d’,’\0’};_______
A) 10      B) 1        C) 6        D) 4
c语言如何创建字符串数组
2.char s[ ]=”\\141\141abc\t”;        
A) 9        B) 12      C) 13      D) 14
3.char *s=”\x69\082\n”;_________
A) 3        B) 5        C) 1        D) 字符串中有非法字符
        考点:本例考查strlen函数及字符串结束符和转义字符的用法。
        分析:因为字符串遇到第一个’\0’即终止,不管第一个’\0’后面还有多少字符,都认为字符串已经终止,所以第一题中的串长为1(注意串长不包括’\0’)。因为转义字符作为一个字符处理,所以第二题中’\\’是一个字符,’\141’是一个字符,’\t’是一个字符,所以串长为9。第三题的第一个字符是十六进制转义字符,’\082’容易被误认为是八进制转义字符,但是注意,8超过了八进制的范围,所以这是三个字符,分别为’\0’’8’’2’,而字符串到’\0’终止,所以串长为1
        答案:1.B  2.A  3.C
【例5以下程序的输出结果是__________
#include<stdio.h>
#include<string.h>
void main()
{
    char st[20]="hello\0\t\'\\";
    printf("%d,%d\n",strlen(st),sizeof(st));
}
A) 9,9      B) 5,20      C) 13,20      D) 20,20
        考点:本例考查strlen函数与sizeof的区别。
        分析: strlen函数是字符串处理函数,它只统计串长,且不包括’\0’sizeof求出的是整个数组的长度,所以两者是不同的。
        答案:B
【例6以下程序的输出结果是_________
#include<stdio.h>
#include<string.h>
void main()
{
    char *p1,*p2,str[50]="ABCDEFG";
    p1="abcd";
    p2="efgh";
    strcpy(str+1,p2+1);
    strcpy(str+3,p1+3);
    printf("%s",str);
}
A) AfghdEFG      B) Abfhd      C) Afhgd      D) Afgd
        考点:本例考查字符串拷贝函数的使用
        分析:第一次拷贝用”fgh”取代了”BCDEFG”,拷贝结束后字符串str”Afgh”,第二次拷贝用”d”取代了”h”,拷贝结束后字符串str”Afgd”
        答案:D
【例7定义如下数组schar s[51];准备将字符串”Happy new year”记录下来,_______是错误的输入语句
A) gets(s+2);
B) scanf(“%20s”,s);
C) for(i=0;i<15;i++) s[i]=getchar( ); s[i]=’\0’;
D) while((c=getchar())!=’\n’) s[i++]=c; s[i]=’\0’;
        考点:本例考查的是字符串的输入。
        分析:字符串可以使用scanf函数与%s进行整体格式输入,也可以使用gets函数整体输入,还可以逐个字符输入。注意使用%s格式输入时遇到空格或回车符都终止输入,所以选项B不能够完整输入,而是只记录了”Happy”。选项CD采用的是逐个字符输入的方式,这时,接收的字符串不会自动添加’\0’,所以最后要添加一个’\0’才能构成字符串。
        答案:B
【例8有以下程序     
#include<stdlib.h>
#include<stdio.h>
void main()
{
    char *p,*q;
    p=(char*)malloc(sizeof(char)*20); q=p;
    scanf("%s%s",p,q);  printf("%s%s\n",p,q);
}   
若从键盘输入:abc def<回车>,则输出结果是:
A) def def                  B) abc def                C) abc d              D) d d
        考点:本例考查字符串的输入
        分析:指针pq通过赋值后,同时指向长度为20字节的动态存储区域,所以在语句scanf(“%s%s”,p,q);中,第二次读入的def覆盖掉第一次读入的abcpq同时指向字符串def。所以输出两个def
        答案:A
【例9有以下程序   
#include<stdio.h>
void main()
{     
    char str[]="xyz",*ps=str;
    while(*ps)  ps++;
    for(ps--;ps-str>=0;ps--)  puts(ps);
}
执行后的输出结果是
A) yz        B) z        C) z        D) x
xyz          yz          yz          xy
xyz                        xyz
        考点:指针指向字符串的操作、字符串输出
        分析:指针ps指向存放字符串的数组str,循环while(*ps)ps++;使指针ps指向字符串结束符,第二个循环首先使ps--ps指向’z’然后输出ps所指的字符串,即”z”,接着指针ps向前挪动,直到ps-str==0,即ps指向str的首地址为止,每挪动一次都输出当前ps所指的字符串,所以依次输出”z””yz””xyz”
        答案:C
【例10有如下程序 
#include<stdio.h>
void main()
{   
    char ch[2][5]={"6937","8254"},*p[2];
    int i,j,s=0;
    for(i=0;i<2;i++)  p[i]=ch[i];
    for(i=0;i<2;i++)
        for(j=0;p[i][j]>'\0';j+=2)
            s=10*s+p[i][j]-'0';
        printf("%d\n",s);
}
该程序的输出结果是_______
A) 69825      B) 63825      C) 6385      D) 693825
        考点:用指针数组中的指针指向字符串数组中的字符串的操作
        分析:指针p[0]指向“6937”,指针p[1]指向”8254”。注意到两重for循环中的里层循环的步长为2,所以四次取出的p[i][j]分别为’6’’3’’8’’5’,然后通过p[i][j]-‘0’使字符转换为数字,最后通过s=10*s+p[i][j]-‘0’;把这四个数转换为一个4位数
        答案:C
【例11语句printf("a\bre\'hi\'y\\\bou\n");的输出结果是______
    A) a\bre\'hi\'y\\\bou            B) a\bre\'hi\'y\bou
    C) re'hi'you                    D) abre'hi'y\bou
        (说明:'\b'是退格符)
        考点:转义字符的使用
        分析:观察这个字符串发现,第一个字符是’a’,第二个字符’\b’正好是退格,所以第三个字符’r’覆盖掉第一个字符’a’,依此类推,本字符串中共有两个退格符,所有有两个字符因被覆盖掉而未输出。注意’\’’是转义字符“单撇号”,’\\’是转义字符\

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。