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

题目来自互联网:http://wenku.baidu.com/view/1b71537201f69e314332947f.html

答案:自己做的,可能有错误,请多指正。               QQ:447872587

C语言部分:语言部分

一、简单编程,请用一句语句完成下列操作

1.     位操作:将变量unsigned long register的0,4,6位清0

 32位下:register&=0xffffffae

分析:0,4,6清0;10101110对应着:1010对应a; 1110对应e

2.     字符串操作:判断字符串char* str1是否起始位置包含char* str2的内容

if(strstr(str1,str2)==str1)

3.     内存操作:将指针unsigned char* ptr的内容向后移动4个字节

*(ptr+4)=*ptr;

4.将无符号变量unsigned int val进行字节序颠倒

(val&0x000000ff<<24)|( val&0x0000ff00<<8) |( val&0x00ff0000>>8)| ( val&0xff000000>>24)

二、写出下列程序的运行结果 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=0x801014

p2+5=0x810005+5*4=0x810000+0x14=0x810014

2.算数运算

Main()

{

Unsignedchar a,b,c,d;

a=30;

b=a++;

c=++a;

d=10*(a++);

}

请问:b=?c=?d=?

b=30,c=32,d=3200

3、逻辑运算

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=0x451AD&0x306

0x 4 5 1 A D

& 0x     3 0 6

= 0x 0 0 1 0 4 即:16*16+4=260

convert = 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;

}

正确应该为:

#include "string"

#include <iostream>

using namespace std;

 

int _tmain(intargc, _TCHAR*argv[])

{

    char*src = "hello,world";

    char*dest = NULL;

    int len = strlen(src);

    dest= (char*)malloc(len+1); //要为\0分配一个空间

    char* d = dest;

    char* s = &src[len-1];     //指向最后一个字符

    while(len-- != 0)

    {

         *d++= *s--;

         *d=0;                      //尾部要加上\0

    }

    cout<<dest<<endl;

    system("pause");

    free(dest);                   //使用完,应当释放空间,以免造成内存泄露

    return0;

}


 

方法二:

int _tmain(intargc, _TCHAR*argv[])

{

char str[]="hello,world";

    int len = strlen(str);

    char t = 0;

    int i;

    for(i=0;i<len/2;i++)

    {

         t=str[i];

         str[i]=str[len-i-1];//不要忘怀多减一个,重视数组的下标

         str[len-i-1]=t;

    }

    cout<<str<<endl;

    system("pause");

    return0;

}


 

四、简答题:

1、头文件的ifndef/define/endif干什么用的?

防止头文件被重复引用

2、定义函数局部变量的时候:

Char array1[100];

Char *array2;

array1和array2都可以当做指针引用,这两个指针在使用的时候有什么区别?

当做函数参数传递的时候,数组可以当指针用,本质就是取数组第一个元素的内存地址传过去,当数组作为函数参数传递的时,该数组自动退化为同类型的指针。

指针也可以当数组用,但是两者的本质不一样;

数组名对应着一块内存,而不是指向一块内存,其地址和容量在生命周期不变,但数组内容可以改变;

指针可以随时指向任意的内存块,其特征是可变,常用指针来操作动态内存。

五、内存问题:

 很简单,不详述。

六、程序编写:

编写一个函数,输入参数为一个字符串指针,将其中的大写变为小写

char* Atoa(char str[])

{

    for(int i=0;str[i]!='\0';i++)

    {

         if(str[i]>='A' && str[i]<='Z')

             str[i] += 32;

    }

    returnstr;

}

int _tmain(intargc, _TCHAR*argv[])

{

char str[100]="Hello,World";

  Atoa(str);

  cout<< str;

return 0;

}


 

 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值