当前位置:毕业生招聘信息网知名企业资料IT/电信Microsoft(微软) → 知名企业资料内容

回忆MS_ATC两道题

作者:佚名  来源:不详  发布时间:2004-4-26 21:59:00

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

相关招聘信息

热门招聘信息more

推荐招聘信息more