启明星辰2011校园招C笔试题(一)

下列程序中的函数 strcpy2() 实现字符串两次复制 , 即将 t 所指字符串复制两次到 s 所指内存空间中 ,合并形成一个新的字符串。例如,若 t 所指字符串为 efgh ,调用 strcpy2 后, s 所指字符串为 efghefgh 。请填空。

#include <stdio.h>

#include <string.h>

void strcpy2(char *s,char *t)

{ char *p=t;

while(*s++=*t++);

s= 【 1 5 】 ;

while( 【 1 6 】 =*p++);

}

main()

{ char str1[100]="abcd",str2[]="efgh";

strcpy2(str1 ,str2); printf("%s\n",str1);

}


正确答案:
答案 s-1 ; *s++
解析:除去第 1 次复制字符串中的结束标志 ‘ \0 ’
             开始第 2 次复制字符串。


●试题五

阅读以下程序说明和C程序,将应填入(n)处的子句,写在答卷纸的对应栏内。

【程序说明】

函数int commstr(char *str1,char *str2,int *sublen)从两已知字符串str1和str2中,找出它们的所有最长的公共子串。如果最长公共子串不止1个,函数将把它们全部找出并输出。约定空串不作为公共子串。

函数将最长公共子串的长度送入由参数sublen所指的变量中,并返回字符串str1和str2的最长公共子串的个数。如果字符串str1和str2没有公共子串,约定最长公共子串的个数和最长公共子串的长度均为0。

【程序】

int strlen(char *s)

{char *t=s;

while(*++);

return t-s-1;

}

intcommstr(char)*str1,char *str2,int *sublen

{char*s1,*s2;

int count=0,len1,len2,k,j,i,p;

len1=strlen(str1);

len2=strlen(str2);

if(len1>len2)

{s1=str1;s2=str2;}

else{len2=len1;s1=str2;s2=str1;}

for(j=len2;j>0;j--)/*从可能最长子串开始寻找*

{for(k=0; (1) <=len2;k++)/*k为子串s2的开始位置*/

{for(i=0;s1[ (2) ]!='\0';i++;)/* i为子串s1的开始位置*/

{/* s1的子串与s2的子串比较*/

for(p=0;p<j)&& (3) ;p++);

if ( (4) )/*如果两子串相同*/

{for(p=0);p<j;p++}/*输出子串*/

printf("%c",s2[k+p]);

printf("\n");

count++;/* 计数增1*/

}

}

}

if (count>0)break;

*sublen=(count>0)? (5) :0;

return count;

}


正确答案:

●试题五

【答案】(1)k+j(2)i+j-1(3)s1i+p==s2k+p(4)p==jp>=j(5)j

【解析】略。

 


以下sstrcpy()函数实现字符串复制,即将t所指字符串复制到s所指向内存空间中,形成一个新的字符串s。请填空。void sstrcpy(char*s,char*t){while(*s++=);}main(){ char str1[100],str2[]="abcdefgh"; sstrcpy(str1,str2); printf("%s\n",strl);}


正确答案:*t++ 或 *(t++)
将t所指字符赋给s,然后各自增1,指向下一字符,知道遇到最后的字符‘0’,则退出循环。


请编写一个函数int compare(char *s,char *t)), 该函数的功能是对两个字符串进行比较。当s所指字符串和t所指字符串相等时,返回值为0;当s所指字符串大于是t指字符串时,返回值大于0;当s所指字符串小于t所指字符串时,返回值小于0。

注意:部分源程序已存在文件PROC8.cpp中。

文件PROC8.cpp的内容如下:

//PROC8.cpp

include <iostream>

include <string>

using namespace std;

int compare(char *s,char *t)

{

//* * * * * * * * *

}

int main ()

{

char str1[100],str2[100];

int result;

cout<<"Input the first string\n";

cin>>str1;

cout<<"Input the second string\n";

cin>>str2;

result=compare(str1,str2);

if (result==0)

cout<<"string1=string2 ! \n";

else if (result>0)

cout<<"string1>string2 ! \n";

else

cout<<"string1<string2 ! \n";

return 0;

}


正确答案:


执行语句序列

char strl[10]="ABCD",str2[10]="XYZxyz";

for (int i=0; strl[i]=str2[i]; i++)

后,数组str1中的字符是XYZxyz,数组str2中的字符串是【 】。


正确答案:XYZxyz
XYZxyz 解析:注意for的循环体为空语句,其第二个表达式为一个赋值语句而不是一个逻辑表达式语句。因此,for循环的作用实际上是将str2的字符逐个赋值给str1中的对应位置。


题目来自互联网:http://wenku.baidu.com/view/1b71537201f69e314332947f.html答案:自己做的,可能有错误,请多指正。 QQ:447872587C语言部分:语言部分一、简单编程,请用一句语句完成下列操作1.位操作:将变量unsigned long register的0,4,6位清032位下:register=0xffffffae分析:0,4,6清0;10101110对应着:1010对应a; 1110对应e2.字符串操作:判断字符串char* str1是否起始位置包含char* str2的内容if(strstr(str1,str2)==str1)3.内存操作:将指针unsigned char* ptr的内容向后移动4个字节*(ptr+4)=*ptr;4.将无符号变量unsigned int val进行字节序颠倒(val0x000000ff24)|( val0x0000ff008) |( val0x00ff00008)| ( val0xff00000024)二、写出下列程序的运行结果 32位1、指针变量:Unsignedchar*p1;Unsignedchar*p2;p1=(Unsigned char*)0x801000;p2=(Unsigned char*)0x810000;请问:p1+5=? p2+5=?p1+5=0x801000+5*4=0x801000+0x14=0x801014p2+5=0x810005+5*4=0x810000+0x14=0x8100142.算数运算Main(){Unsignedchar a,b,c,d;a=30;b=a++;c=++a;d=10*(a++);}请问:b=?c=?d=?b=30,c=32,d=32003、逻辑运算unsigned int regval = 0x451AD,evenMask= 0x306,bitConvert = 0xFF;int event = 0,convert = 0;event = regval bitConvert;convert = regval^ convert;请问:event=? Convert=?event= 260 Convert=282962分析:event=0x451AD0x306,0x 4 5 1 A D0x 3 0 6= 0x 0 0 1 0 4 即:16*16+4=260convert = 0x451AD ^ convert;三、请指出下列程序存在的问题,如何修正:1、说明:以下代码是把一个字符串倒序,如”abcd”倒序后变为”dcba”int _tmain(intargc, _TCHAR*argv[]){char*src = "hello,world";char *dest = NULL;intlen = strlen(src);char*dest = (char*)malloc(len);char*d = dest;char*s = src[len];while(len-- != 0){d++= s--;}printf("%s",dest);return0;}正确应该为:方法二:四、简答题:1、头文件的ifndef/define/endif干什么用的?防止头文件被重复引用2、定义函数局部变量的时候:Char array1[100];Char *array2;array1和array2都可以当做指针引用,这两个指针在使用的时候有什么区别?当做函数参数传递的时候,数组可以当指针用,本质就是取数组第一个元素的内存地址传过去,当数组作为函数参数传递的时,该数组自动退化为同类型的指针。指针也可以当数组用,但是两者的本质不一样;数组名对应着一块内存,而不是指向一块内存,其地址和容量在生命周期不变,但数组内容可以改变;指针可以随时指向任意的内存块,其特征是可变,常用指针来操作动态内存。五、内存问题:很简单,不详述。六、程序编写:编写一个函数,输入参数为一个字符串指针,将其中的大写变为小写

执行语句序列

char str1[10]="ABCD",str2[10]="XYZxyz";

for(int i=0;strl[i]=str2[i];i++);

后,数组strl中的字符串是______。


正确答案:XYZxyz
XYZxyz 解析:注意for的循环体为空语句,其第二个表达式为一个赋值语句而不是一个逻辑表达式语句。因此,for循环的作用实际上是将str2的字符逐个赋值给str1中的对应位置。


阅读下列函数说明和C函数,将应填入(n)处的字句写在对应栏内。

[函数2.1说明]

函数strcpy的功能是将字符串str2的内容复制到字符申str1。

[函数2.1]

(1) strcpy (char *slr1, const char *str2)

{ char * temp;

while( * str2!='\0') *cp++ =(2);

(3)='\0';

return str1;

}

[函数2.2说明]

函数int strcmp(const char *str1, const char *str2)的功能是按字典序比较两个字符串str1和str2的大小。当str1<str2时返回-1,当str1>str2时返回1,否则返回0。

[函数2.2]

int strcmp(const char *str1, const char *str2)

{ while( *str1= =* str2) {

if(* s1= =(4)) return 0;

s1++;

(5);

}

if( *str1<*str2) return -1;

return 1;

}


正确答案:char * (2) * str2++ (3) * cp (4) ‘\0’ (5) s2++或 ++s2
char * (2) * str2++ (3) * cp (4) ‘\0’ (5) s2++或 ++s2 解析:(1)根据函数说明,char *是函数strcpy的返回值类型;
(2)while循环是字符串复制的关键,它将str2的字符一个个复制到cp;
(3)字符复制完成后,应在字符串cp的末尾添加结束符;
(4)~(5):while循环的功能是从字符串首开始逐个比较str1和str2的每一字符,如果循环一直执行到两字符串末尾,则说明两串相等,应返回0值。


请补充函数fun(),该函数的功能是:把从主函数中输入的字符串str2接在字符串str1的后面。

例如:str1=“How do”,str2=“you do?”,结果输出: How do you do?

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。

试题程序:

include<stdio.h>

include<conio.h>

define N 40

void fun(char*str1,char *str2)

{

int i=0;

char *pl=str1;

char*p2=str2;

while(【 】)

i++;

for(;【 】;i++)

*(p1+i)=【 】;

*(p1+i)='\0';

}

main()

{

char str1[N],str2[N);

clrscr();

printf("*****Input the string str1 & Str2*****\n");

printf("\nstr1:");

gets(str1);

printf("\nstr2:");

gets(str2);

printf("**The string str1 & str2**\n");

puts(str1);

puts(str2);

fun(str1,str2);

printf("*****The new string *****\n");

puts(str1);

}


正确答案:*(p1+i) *p2 *p2++
*(p1+i) *p2 *p2++ 解析:第一空:变量i用来记录字符串str1的长度,当指针指列宁符串str1结束标志符‘\0’时,while循环结束,变量 i停止累加。第二空:指针p2指向字符串str2,通过for循环将字符中str2按在str1后面,循环结束的条件是指针p2所指的字符是字符串结束标志符‘\0’。第三空:指针p2最初指向字符串str2的首字符,通过自加1,使指针p2依次向后移动,指向str2的各个字符,实现将宁符串str2接在str1后面的功能。


请补充函数fun,该函数的功能是比较字符串str1和str2的大小,井返回比较的结果。

例如: 当str1=“cdef",str2=“cde”时,函数fun()返回“>”。

注意:部分源程序给出如下。

请勿改动主函数main 和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。

试题程序:

include< stdio, h>

include<conio. h>

define N 80

char *fun (char *str1,char *str2)

{

char *p1=str1, *p2=str2;

while (*p1 & & *p2 )

{

if (【 】)

return "<";

if(【 】)

return ">";

p1++;

p2++;

}

if (*p1=*p2)

return "==";

if (*p1==【 】)

return "<";

else

return ">";

}

main()

{

char str1 [N], str2 [N];

clrscr ();

printf ("Input str1: \n");

gets (str1);

printf ("Input str2: \n");

gets (str2);

printf ("\n*****the result*****\n");

printf ("\nstr1 %s str2", fun (str1, str2) );

}


正确答案:*p1*p2 *p1>*p2 \0’
*p1*p2 *p1>*p2 \0’ 解析:第一空:比较两个字符串的大小,是从第一个字符开始比较,如果两字符不相等,则由字符的大小决定字符串 P2指向字符串str2,如果p1所指的字符小于p2所指的字符,则字符串str1小于字符串str2。第三空:如果p1所指的字符大于p2所指的字符,则字符串str1 大于字符串str2。第三空:如果str1是str2 的前一部分,则str1 的所有字符都等于str2 中的对应字符,而字符串结束标记符‘\0’小于其他字符,所以,这里如果p1所指的字符等于‘\0’,则表示字符串str1小于字符串str2。


阅读以下程序说明和C程序,将应填入(n)处的子句,写在对应栏内。

【程序说明】

函数int commstr(char * str1,char * str2,int * sublen)从两已知字符串str1和str2中,找出它们的所有最长的公共子串。如果最长公共子串不止1个,函数将把它们全部找出并输出。约定空串不作为公共子串。

函数将最长公共子串的长度送入由参数sublen所指的变量中,并返回字符串str1和str2的最长公共子串的个数。如果字符串str1和str2没有公共子串,约定最长公共子串的个数和最长公共子串的长度均为0。

【程序】

int strlen(char * s)

{char *t=s;

while( * ++);

return t-s-1;

}

int commstr(char) *str1,char *str2,int *sublen

{ char*s1, *s2;

int count=0,len1 ,len2,k,j,i,p;

len1:=strlen(str1)

len2 = strlen(str2);

if(len1>len2)

{s1=str1 ;s2=str2;}

else {len2 = len1;s1 = str2;s2 = str1;}

for(j=len2;j>0;j--) /*从可能最长子串开始寻找*/

{for(k=0;(1)<:len2;k++) /*k为子串s2的开始位置*/

{for(i=0;s1[(2)]!='\0';i++;) /*i为子串s1的开始位置*/

{ /*s1的子串与s2的子串比较*/

for (p=0;p<j)&&(3);p++);

if ((4)) /*如果两子串相同*/

{for(p=0);p<j;p++} /*输出子串*/

printf ("%c",s2[k+p]);

printf ("\n");

count++;/*计数增1 */

}

}

}

if (count>0) break;

*sublen=(count>0)?(5):0;

return count;

}


正确答案:(1)k+j (2)i+j-1 (3)s1[i+P]==s2[k+P] (4)P==j或p>=j (5)j
(1)k+j (2)i+j-1 (3)s1[i+P]==s2[k+P] (4)P==j或p>=j (5)j

更多 “启明星辰2011校园招C笔试题(一)” 相关考题
考题 下列语句中,正确的是______。A.static char str[]="China";B.static char str[];str="China";C.static char str1[5],str2[]={"China"};strl=str2;D.static char str1[],str2[];str2={"China"};strcpy(str1,str2);正确答案:A

考题 下列程序的输出结果是 ()。 #include  #include   main( ) {    int i=0;    char str1[10]=“1234”, str2[10]= “567”;    strcat(str1,str2);    while(str2[i++]!=‘/0’)     str2[i]=str1[i];    puts(str2);   }正确答案:5234567

考题 单选题设已定义:char str1[10],str2[10]=”Fujian”;则能将字符串”Fujian”赋给数组str1的正确语句是()A str1=”Fujian”B strcpy(str1,str2)C strcpy(str2,str1)D str1=str2正确答案:A解析:暂无解析

考题 在下列语句中,正确的是( )A.static char str[]="China";B.static char str[];str="China";C.static char str1[5],str2[]={"China"};str1=str2;D.static char str1[],str2[];str2={"China"};strcpy(str1,str2);正确答案:A

考题 使用VC++6.o打开考生文件夹下的源程序文件2.cpp。请完成函数fun(char*str1,char*str2),此函数的功能是计算str1中出现str2的个数,当不出现时,则返回0。 例如: str1为“asdfsfdfg” str2为“sf”则返回1 str2为“df”则返回3 注意:不能修改函数的其他部分。 试题程序: include<iostream.h> //注意只能使用int类型,不能类型转换 intfun(char*str1,char*str2) { } voidmain() { charstr1[1024]; charstr2[256]; cout<<"pleaseinputastring:"<<endl; cin.getline(str1,1024); cout<<"pleaseinputotherstring;"<<endl cin.getline(str2,256); cout<<fun(str1,str2); cout<<endl; return; }正确答案:intfun(char*str1.char*str2) { intsize=0; intstrllen; intstr2len; for(strllen=0;str1[strllen]!=0;strllen++); for(str21en=0;str2[str21en]!=0;str2len++); for(inti=0:i<strllen;i++) { intj=0; for(;j<str21en;j++) if(strl[i+j]!=str2[j]) break; if(i==str21en) { ++size; i+=j; } } returnsize; } 【解析】本题考查的是字符串查找算法。首先求出两个字符串的长度,然后循环遍历第1个字符串,再使用一个内循环遍历第2个字符串,判断两个字符串相应位置是否一致。如果遍历完第2个字符串,所有位置都一致,则记数值size增1,即找到一个子串。

考题 下面函数的功能是 char*fun(char*strl,char*str2) { while((*strl)&&(*str2++=*strl++)); return str2;}A.求字符串的长度B.比较两个字符串的大小C.将字符串str1复制到字符串str2中D.将字符串str1接续到字符串str2中正确答案:C解析:while语句的一般形式为:while(表达式)语句;其中表达式是循环条件,语句为循环体,while语句的语义是:计算表达式的值,当值为真(非0)时,执行循环体语句。本题中逻辑与符号连接的表达式值为真,*str2++=*strl++语句是将strl的内容逐个复制到str2字符串。

考题 以下选项中,属于合法语句的是( )。A.char nm[10]; nm="C Program";B.char str1[10]="computer",str2[10]; str2=str1;C.char str[7]="siring!";D.char sp[]="Hello!";正确答案:D解析:本题考查字符串数组的定义和初始化,属于概念考查类型的题目。A选项中,"CProgram"这个字符串常量在赋值过程中给出的是这个字符串在内存中所占连续存储单元的首地址,而nm是不可直接赋值的数组名,因此A选项中的语句不合法。B选项,C++不支持数组之间的直接赋值,所以也不正确。C选项,表面上没有错,但仔细看一下会发现,定义时数组长度为7,而赋值的字符串常量的个数为8,最终导致越界,所以也不合法。

考题 阅读下列程序,写出程序的运行结果【】。 include void main() { charstr1[ ]: "Hello,阅读下列程序,写出程序的运行结果【 】。include<iostream. h>void main() { char str1[ ]: "Hello, World?;char str2[100];int i=0;do{if (str1[i]>= 'a'&& str1[i]<= 'z' )str2[i]=str1[i]-32;elsestr2[i]=strl [i];i++;}while(strl[i]!='\0');str2[i]='\0';cout<<str1<<end1;cout<<str2<<end1;}正确答案:Hello World!HELLO WORLD!Hello, World!HELLO, WORLD!

考题 填空题下列程序的输出结果是 ()。 #include  #include   main( ) {    int i=0;    char str1[10]=“1234”, str2[10]= “567”;    strcat(str1,str2);    while(str2[i++]!=‘/0’)     str2[i]=str1[i];    puts(str2);   }正确答案:5234567解析:暂无解析

考题 阅读下列函数说明和C函数,将应填入(n)处的字句写在对应栏内。[函数2.1说明]Fibonacci数列中头两个数均为1,从第三个数开始,每个数等于前两个数之和。下述程序计算Fibonacci数列中前15个数,并以每行5个数的格式输出。[函数2.1]include <stdio.h>main(){ int i,f,f1=1,f2=1;printf("%5d%5d",f1,f2);for(i=3;i<=15;i++){f=(1);printf("%5d",f);if((2)= =0) printf("\n");f1=12;(3);}}[函数2.2说明]函数fun(char *str1,char *str2)的功能是将字符串str2拼接到str1之后。[函数2.2]fun(char *str1,char *str2){ int i,j;for(i=0;str1[i]!='\0';i++);for(j=0;str2[j]!='\0';j++) (4);(5);}正确答案:(1) f1+f2 (2) i%5 (3) f2=f(4) str1[i++]=str2[j] (5) str1[i]='\0'(1) f1+f2 (2) i%5 (3) f2=f(4) str1[i++]=str2[j] (5) str1[i]='\0' 解析:(1)根据Fibonacci数列的性质,f等于前两数f1与f2之和;(2)每输出5个数以后应当换行,此条件即:i除以5余 0;(3)计算一个数值前,f1与f2都应更新,其中f2应为刚计算出的f;(4)此循环的功能是将str2的字符添加到str1末尾;(5)函数结束前应在str1末尾添加结束符。