| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1390 人关注过本帖
标题:使用 strcat 遇到一个匪夷所思的问题
取消只看楼主 加入收藏
锋了
Rank: 7Rank: 7Rank: 7
来 自:向日葵幼儿园
等 级:黑侠
威 望:2
帖 子:306
专家分:586
注 册:2012-10-27
收藏
得分:0 
回复 17 楼 embed_xuel
NAME
       strcat, strncat - concatenate two strings
SYNOPSIS
       #include <string.h>
       char *strcat(char *dest, const char *src);
       char *strncat(char *dest, const char *src, size_t n);
DESCRIPTION
       The  strcat() function appends the src string to the dest string, over-
       writing the null byte ('\0') at the end of dest, and then adds a termi-
       nating  null  byte.   The  strings may not overlap, and the dest string
       must have enough space for the result.

NAME
       strlen - calculate the length of a string
SYNOPSIS
       #include <string.h>
       size_t strlen(const char *s);
DESCRIPTION
       The strlen() function calculates the length of the string s, not including the terminating '\0' character.
2014-07-17 14:47
锋了
Rank: 7Rank: 7Rank: 7
来 自:向日葵幼儿园
等 级:黑侠
威 望:2
帖 子:306
专家分:586
注 册:2012-10-27
收藏
得分:0 
回复 19 楼 embed_xuel
上面的代码输出是这样的
UIN: &UIN=835907249
UIN:
VER=1.1&CMD=Login&SEQ=Thu Jul 17 12:33:20 2014&PS=8d3f0280996672d092acccff7f&M5=1&LC=9326B87B234E7235
2014-07-17 14:51
锋了
Rank: 7Rank: 7Rank: 7
来 自:向日葵幼儿园
等 级:黑侠
威 望:2
帖 子:306
专家分:586
注 册:2012-10-27
收藏
得分:0 
回复 22 楼 embed_xuel
是一个32位的加密字符串
2014-07-17 15:00
锋了
Rank: 7Rank: 7Rank: 7
来 自:向日葵幼儿园
等 级:黑侠
威 望:2
帖 子:306
专家分:586
注 册:2012-10-27
收藏
得分:0 
回复 24 楼 embed_xuel
程序代码:
void QMD5(const void *encrypt, size_t strlen, unsigned char *md)
{
    MD5_CTX     ctx;

    if (MD5_Init(&ctx) != 1){
        fprintf(stderr, "MD5_Init error:%s\n", strerror(errno));
        exit(1);
    }
    if (MD5_Update(&ctx, encrypt, strlen) != 1){
        fprintf(stderr, "MD5_Update error:%s\n", strerror(errno));
        exit(1);
    }
    if (MD5_Final(md, &ctx) != 1){
        fprintf(stderr, "MD5_Final error:%s\n", strerror(errno));
        exit(1);
    }
}

    char    encryptpwd[33];
    char    tmp[3];
    time_t      tick;
    unsigned char md[17];

/* Http protocol command string */
    char    ver[23 + 25] = "VER=1.1&CMD=Login&SEQ=";
    char    seq[25];
    char    uin[MAXNAME + 5] = "&UIN=835******";
    char    ps[33 + 6] = "&PS=";
    char    m5[27] = "&M5=1&LC=9326B87B234E7235";

    tick = time(0);
    if (ctime_r(&tick, seq) == NULL)
        err_quit("ctime_r error");
    seq[strlen(seq)-1] = '\0';
   

    QMD5(pwd, strlen(pwd), md);
    for (i = 0; i < strlen(md); i++)
    {
        sprintf(tmp, "%02x", md[i]);
        strcat(encryptpwd, tmp);
    }

    encryptpwd[strlen(encryptpwd)] = '\0';
    strcat(ver, seq);
    printf("UIN: %s\n", uin);
    //strcat(uin, name);
    strcat(ps, encryptpwd);
    printf("UIN: %s\n", uin);
2014-07-17 15:11
锋了
Rank: 7Rank: 7Rank: 7
来 自:向日葵幼儿园
等 级:黑侠
威 望:2
帖 子:306
专家分:586
注 册:2012-10-27
收藏
得分:0 
回复 27 楼 embed_xuel
忽略那两句吧,你就当没有,因为没有那两句是不影响的,我原来只是出问题后试验性加进去的
2014-07-17 15:35
锋了
Rank: 7Rank: 7Rank: 7
来 自:向日葵幼儿园
等 级:黑侠
威 望:2
帖 子:306
专家分:586
注 册:2012-10-27
收藏
得分:0 
回复 29 楼 embed_xuel
我发现问题了,其实是针对unsigned char 类型调用strlen和sizeof有时得到的值不是我们期望的,就是混淆了strlen和sizeof的使用


[ 本帖最后由 锋了 于 2014-7-17 16:52 编辑 ]
2014-07-17 16:48
锋了
Rank: 7Rank: 7Rank: 7
来 自:向日葵幼儿园
等 级:黑侠
威 望:2
帖 子:306
专家分:586
注 册:2012-10-27
收藏
得分:0 
回复 31 楼 embed_xuel
   
程序代码:
 printf("%d\t", strlen(md));
    QMD5(pwd, strlen(pwd), md);
    printf("%d\n", strlen(md));
    for (i = 0; i < strlen(md); i++)
    {
        sprintf(tmp, "%02x", md[i]);
        strcat(encryptpwd, tmp);
    }
第一个printf输出的是6!!!
第二个printf输出的是22!!!
其实还是回到了最基本的问题,第一个输出6是声明时没有初始化!
第二个输出22(在添加初始化后变为27)还不太清楚。


[ 本帖最后由 锋了 于 2014-7-17 17:19 编辑 ]
2014-07-17 17:14
快速回复:使用 strcat 遇到一个匪夷所思的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017155 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved