首页
社区
课程
招聘
[旧帖] c语言难题 0.00雪花
发表于: 2011-6-10 16:09 1766

[旧帖] c语言难题 0.00雪花

2011-6-10 16:09
1766
#include <stdio>

int main()
{
        char *ch;
        ch=new char[10];

        scanf("%s",ch);

        if("-h"==ch)
        {
                printf("ok");
        }
        return 0;
}
我输入-h不打印ok,这是为什么?怎么解决?
图片是我单步调试的关键地方。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 79
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
[QUOTE=不是数字;968293]#include <stdio>

int main()
{
        char *ch;
        ch=new char[10];

        scanf("%s",ch);

        if("-h"==ch)
        {
                printf("ok");
        }
        return 0;
}
我输入-h不打...[/QUOTE]

亲 不要用等号亲
用strcmp
用==比的是地址啊亲
2011-6-10 16:12
0
雪    币: 4
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
太感谢了,亲
2011-6-10 16:13
0
雪    币: 79
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
表客气 亲..
2011-6-10 16:14
0
雪    币: 351
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
#include <stdio.h>

int main()
{
        char *ch;
        ch=new char[10];

        scanf("%s",ch);

        if(ch[0] == '-' && ch[1] =='h')
        {
                printf("ok");
        }

        delete ch;
        return 0;
}
2011-6-10 16:15
0
雪    币: 69
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
亲。。。
2011-6-10 16:42
0
雪    币: 79
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
亲...包邮啊亲
2011-6-10 16:51
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
对刚学过一天C的的来说确实是难题
2011-6-10 17:08
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
好大的难题,难死我了。。
2011-6-10 17:36
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
给好评了,亲~
2011-6-10 18:08
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
why dont use strcmp
2011-6-11 00:22
0
雪    币: 64
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
有意思
。。。
2011-6-11 07:20
0
雪    币: 41
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
果然是难题…………⊙.⊙
2011-6-11 07:37
0
雪    币: 191
活跃值: (130)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
14
关于程序问题前面已经说了,我也啰嗦下 , 大家莫拍啊
    if("-h" == lpBuf)
这句就像前面说的比较的对应变量和常量的地址
"-h" 常量地址,调试时为 0xBA783c
lpBuf保存的是堆地址,调试时0x00488470
实际的比较是 if (0xBA783c == 0x00488470),我是看你不到那里会等啊
00BA210D  cmp         dword ptr [lpBuf],offset string "-h" (0BA783Ch)
00BA2114  jne         wmain+7Dh (0BA212Dh)

这里改一版
    (主要是说明下情况,实际这么写是找抽的)
    if(((char*)&"-h")[0] == lpBuf[0] && ((char*)&"-h")[1] == lpBuf[1])
常量"-h" 对应内存内容为:
    0x01057938  2d 68 00 00 25 73 00 00 5c 87 05  -h..%s..\?.
lpBuf的堆内容为:
    0x003C8470  2d 68 00 cd cd cd cd cd cd cd fd  -h.????????<--应该初始化下的
对应的汇编为:
   取全局变量"-h"的第一字节到eax
0105217D  movsx       eax,byte ptr [string "-h" (1057938h)]
   取lpBuf保存的堆地址,取堆中第一字节
01052184  mov         ecx,dword ptr [lpBuf]
01052187  movsx       edx,byte ptr [ecx]
  比较的是内存对应的内容,第二次比较类似
0105218A  cmp         eax,edx
0105218C  jne         wmain+97h (10521B7h)
0105218E  movsx       eax,byte ptr ds:[1057939h]  //1057938h后面一个字节
01052195  mov         ecx,dword ptr [lpBuf]
01052198  movsx       edx,byte ptr [ecx+1]
0105219C  cmp         eax,edx
0105219E  jne         wmain+97h (10521B7h)

程序其他小瑕疵:
  申请的空间要检查是否ok
   使用完毕要释放
  变量名字要形象
const int g_nBufSize  = 10;

int _tmain(int argc, _TCHAR* argv[])
{    
    char *lpBuf;    // ch
    lpBuf = new char[g_nBufSize];
    if (NULL == lpBuf)      //虽然new很少失败
        return -1;
    memset(lpBuf, 0, g_nBufSize);
    scanf("%s", lpBuf);

    if(((char*)&"-h")[0] == lpBuf[0] && ((char*)&"-h")[1] == lpBuf[1])
    //if ( '-' == lpBuf[0] && 'h' == lpBuf[1])      
    {
        printf("ok");
    }

    if (lpBuf)                  //记得释放哦
    {
        delete lpBuf;
        lpBuf = NULL;
    }
    return 0;
}



希望此类难题会被你轻松搞定, 周末愉快。
2011-6-11 10:14
0
雪    币: 49
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
前两天刚看到数组这一章还没看完呢   初学者
2011-6-11 18:12
0
游客
登录 | 注册 方可回帖
返回
//