MSRA相关考题

MSRA相关考题

在网上找到了MSRA相关考题,大多是没有答案的,偶给整理一下,给出偶的答案,要是有错误,希望与我交流。

1.打印"Welcome MSR Asia"

#include

#include

char * GetName (void)

{

//To return "MSR Asia" String

char name[]="MSR Asia";

return name;

}

void main(int argc, char* argv[])

{

char name[32];

//Fill in zeros into name

for(int i=0;i<=32;i++)

{

name[i]=''/0'';

}

//copy "Welcome" to name

name="Welcome";

//Append a blank char

name[8]='''';

//Append string to name

strcat(name,GetName());

//print out

printf(name);

}

找出程序中的错误。

Solved By Super.Jiju

1. 在char * GetName (void)中,char name[]="MSR Asia”; return name;错误在于 name是在栈上面申请内存的,return name的效果是return 栈内存地址的一个copy,当函数调用结束后,name所拥有的内存被释放,如果想通过返回指向该数组的指针,应该用new/malloc申请内存。

2. 在main函数里,name[32]在for循环赋值的时候会越界。name[i]=’/0’,如果将字符串复制进数组,应该用strcpy,追加应该用strcat

3. 定义指针指向GetName(),并释放内存。

修改后程序如下:

#include

#include

#include

char * GetName (void)

{

//To return "MSR Asia" String

char *name=(char *)malloc(strlen("MSR Asia")+1);

strcpy(name,"MSR Asia");

return name;

}

void main(int argc, char* argv[])

{

char name[32];

//Fill in zeros into name

for(int i=0;i<32;i++)

{

name[i]='/0';

}

//copy “Welcome”to name

//name="Welcome";

strcat(name,"Welcome ");

/*Append a blank char

name[8]=' ';

Append string to name*/

char *p=GetName();

strcat(name,p);

//print out

printf(name);

free(p);

}

2. 将空格为分隔符的字符串逆序打印,但每个token不逆序。例如 "Hello world I am william",那么打印出的结果为"william am I world Hello"

C++实现如下:用c语言实现思想类似,查找空格,strcat

#include

#include

using namespace std;

string Inverse(string str)

{

string str1;//return str;

size_t pos1=0,pos2=str.length();

while((pos1=str.find_last_of(" ",pos2))

{

str1+=str.substr(pos1+1,pos2-pos1);

str1+=" ";

pos2=pos1-1;

}

str1+=str.substr(0,str.find_first_of(" "));

return str1;

}

int main()

{

string str;

getline(cin,str);

cout< <

system("pause");

return 0;

}

问题:编写atoi,即将字符串转为整型。

参考了被人的代码,佩服:

#include

#include

using namespace std;

int myatoi(string str)

{

int i;

int val;

for ( i = 0; isspace(str[i]); i++) ;//第i位的为str第一个非空位

int sign = (str[i] == '-') ? -1 : 1; //判断首位符合

if('-' == str[i] || '+' == str[i]) i++;

for(val = 0; str[i] != '/0';i++)

{

if( isspace(str[i])) continue;

if(isdigit(str[i]))

{

val = str[i]-'0' + 10*val; //str[i]-'0'即str[i]与'0'位置差

}

}

return val * sign;

}

void main()

{

string str;

getline(cin,str);

cout< <

system("pause");

}

1写出下列算法的时间复杂度。
(1)冒泡排序;

(2)选择排序;

(3)插入排序;

(4)快速排序;

(5)堆排序;

(6)归并排序;

123-> O(n^2),456->O(n*log(n))

写出下列程序在X86上的运行结果。

struct mybitfields

{

unsigned short a : 4;

unsigned short b : 5;

unsigned short c : 7;

}test ;

void main(void)

{

int i;

test.a=2;

test.b=3;

test.c=0;

i=*((short *)&test);

printf("%d/n",i);

}

http://super-jiju.spaces.live.com/blog/cns!806C498DDEE76B61!315.entry

里面有相关位域的介绍。

0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0

从右到左依次给a,b,c分配4 5 7个位,short占两个字节,共16位,那么赋值后,结构体内应如上图所示,按照short型读取信息,所以应该输出50(110010);由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。即本题中不能超过16位。

写出下列程序的运行结果。

unsigned int i=3;

cout<

<="" p="">这里面i占了32位,unsigned int的取值范围是0-2^32-1;所以-3用unsigned int表示即为2^32+2;

<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值