- ·上一篇知名企业资料:MS考经
- ·下一篇知名企业资料:ATC实习经历和我了解的MSRA & ATC
回忆MS_ATC两道题
1.找Bug
int CopyStringCount(const char* Str)
{
int nCount = 0;
char* pBuffer;
pBuffer = new char[_MAX_PATH];
strcpy(pBuffer,Str);
while(;pBuffer ;pBuffer++)
if(pBuffer == ''''\\'''') nCount ++;
return nCount;
}
2. 写输出
void foo(int p1[])
{
*p1 += 5;
}
void bar(int p2[])
{
p2[1] = 15;
}
void main()
{
int a[]={3,4,5};
int b[]={3,4,5};
int *p2;
p2=&a[1];
bar(p2);
printf("%i %i %i\n",a[0],a[1],a[2]);
p2=&b[0];
p2++;
foo(p2);
bar(p2);
printf("%i %i %i\n",b[0],b[1],b[2]);
}
void foo(int p1[])
: {
: *p1 += 5;
: }
:
: void bar(int p2[])
: {
: p2[1] = 15;
: }
: void main()
: {
: int a[]={3,4,5};
: int b[]={3,4,5};
: int *p2;
: p2=&a[1];
: bar(p2);
: printf("%i %i %i\n",a[0],a[1],a[2]);
: p2=&b[0];
: p2++;
: foo(p2);
: bar(p2);
: printf("%i %i %i\n",b[0],b[1],b[2]);
: }
我的解答:
1 p2=&a[1] -- p2指向了a数组的第二个元素4
2 函数bar(p2) -- 将形参指针的第二个元素设为15,即a数组的第三个元素的值设为15
3 此时a数组的三个值分别为3,4,15; 打印结果就是3 4 15
(注: %i的作用 -- 自动匹配进制数 如果有"0x*****"字样,则当作16进制输出;如果有"0*****"字样,则当作8进制输出;否则当作10进制输出)
4 p2=&b[0] -- p2指向了b数组的第一个元素3
5 p2++ -- p2指向了b数组的第二个元素4
6 foo(p2) -- 将p2所指的数据自加5,即b数组的第二个元素变为9
7 bar(p2) -- 将b数组的第三个元素变为15
8 打印结果就是 3 9 15
最后的输出应该是:
3 4 15
3 9 15
不知道对不对,大家来看一看?!
找Bug
int CopyStringCount(const char* Str)
{
int nCount = 0;
char* pBuffer;
pBuffer = new char[_MAX_PATH];
strcpy(pBuffer,Str);
while(;pBuffer ;pBuffer++)
if(pBuffer == '''''''') nCount ++;
return nCount;
}
1 for而不是while
2 if(pBuffer == '''''''') nCount ++; -- 应该是*pBuffer
3 pBuffer指针用过后应该释放,delete pBuffer
4 循环终止条件错误,程序本意是*pBuffer到''''\0''''的时候,对应的ascii码是0,所以跳出循环了
感谢hybird的提醒,哈哈
请大家继续探讨!
int CopyStringCount(const char* Str)
{
int nCount = 0;
char* pBuffer;
pBuffer = new char[_MAX_PATH];
strcpy(pBuffer,Str);
for(;*pBuffer!=''''\0''''; pBuffer++)
if(*pBuffer == ''''\'''') nCount ++;
delete [] pBuffer;
// 添加了delete [] pBuffer, 编译通过,但执行起来报错;
// 另,与这个_MAX_PATH有关吗?
return nCount;
}
void main()
{
char s[] = "dsfdfsfdsfsd";
scanf("%s", s);
printf("%i\n", CopyStringCount(s));
}
从函数名判断,这个函数应该有拷贝的动作.但是,原先开内存来拷贝的方式当然是无效的.函数返回后pBuiff就没用了.所以,我自做主张的将pBuff移到了外边作为全局变量.(当然说明了为什么要移出来).
另外,这道题一看就有5~6个BUG.可惜BUG太多了,所以我也没有完全数落出来.我最后的答案是
char g_pBufff[_MAX_PATH];
int xCopyStringAndCoount(cha * pStr)
{
int count =0;
if(pStr==NULL) return -1; //为了表示异常,因此返回-1,而不是0
for(;pStr;pStr++) //这里第二个pStr应该是*pStr,但是我当时没注意到.55
{
if( *pStr ==''\\'' ) count ++;
}
memset(g_pBuff,0,_MAX_PATH);//这里要记得清零,否则g_pBuff会带一堆垃圾尾巴,当然,理论上说,不清零也没关系.只是个人习惯吧.清零后读代码更清楚些.
sprintf(g_pBuff,"%s",pStr); //这里我感觉用strcpy有点不对头,但是又说不出是什么,所以自做主张的用了sprintf,呵呵,经大家提醒才知道,strcpy之前是需要判断pStr的字符串
长度
的.
return count;
}
恩.好象是这样的.凭记忆了.:P
|
请在邮件中注明:信息来自Byszp.COM
[各地求职生活指南]
[进入查询知名企业资料]
![]() ![]() |


