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