2 juncaijuncai juncaijuncai 于 2016.03.28 11:33 提问

url转换的时候缓冲区溢出,大神帮忙改一下,跪谢了 20C

char para[] = "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww&subject=订啊号:20160324001&total_fee=0.01";

char cDestDir[] = "";

int i = strlen(para);
CString stre = _T("");
stre.Format(_T("%d"),i);
MessageBox(stre);

UrlEncode(para,cDestDir,500,FALSE);

// CString str = _T("");
// char* str = "it is a test";
// str.Format("%s",str);
// ShellExecute ( NULL, NULL, cDestDir, NULL, NULL, SW_NORMAL );
// TODO: 在此添加控件通知处理程序代码

// char a[] = "This is a test";
CString str(cDestDir);
MessageBox(str);

ShellExecute ( NULL, NULL, str, NULL, NULL, SW_NORMAL );

1个回答

juncaijuncai
juncaijuncai   2016.03.28 11:33

BOOL UrlEncode(const char* szSrc, char* pBuf, int cbBufLen, BOOL bUpperCase)
{
if(szSrc == NULL || pBuf == NULL || cbBufLen <= 0)
return FALSE;

size_t len_ascii = strlen(szSrc);
if(len_ascii == 0)
{
    pBuf[0] = 0;
    return TRUE;
}

//先转换到UTF-8
char baseChar = bUpperCase ? 'A' : 'a';
int cchWideChar = MultiByteToWideChar(CP_ACP, 0, szSrc, len_ascii, NULL, 0);
LPWSTR pUnicode = (LPWSTR)malloc((cchWideChar + 1) * sizeof(WCHAR));
if(pUnicode == NULL)
    return FALSE;
MultiByteToWideChar(CP_ACP, 0, szSrc, len_ascii, pUnicode, cchWideChar + 1);

int cbUTF8 = WideCharToMultiByte(CP_UTF8, 0, pUnicode, cchWideChar, NULL, 0, NULL, NULL);
LPSTR pUTF8 = (LPSTR)malloc((cbUTF8 + 1) * sizeof(CHAR));
if(pUTF8 == NULL)
{
    free(pUnicode);
    return FALSE;
}
WideCharToMultiByte(CP_UTF8, 0, pUnicode, cchWideChar, pUTF8, cbUTF8 + 1, NULL, NULL);
pUTF8[cbUTF8] = '\0';

unsigned char c;
int cbDest = 0; //累加
unsigned char *pSrc = (unsigned char*)pUTF8;
unsigned char *pDest = (unsigned char*)pBuf;
while(*pSrc && cbDest < cbBufLen - 1)
{
    c = *pSrc;
    if(isalpha(c) || isdigit(c) || c == ';' || c == '/' || c == '?' || c == ':' || c =='@' || c =='&'|| c =='='|| c =='+'|| c =='$'|| c ==','|| c =='-'|| c =='_'|| c =='.'|| c =='!'|| c =='~'|| c =='*'|| c =='`'|| c =='('|| c ==')' )
    {
        *pDest = c;
        ++pDest;
        ++cbDest;
    }
    else if(c == ' ')
    {
        *pDest = '+';
        ++pDest;
        ++cbDest;
    }
    else
    {
        //检查缓冲区大小是否够用?
        if(cbDest + 3 > cbBufLen - 1)
            break;
        pDest[0] = '%';
        pDest[1] = (c >= 0xA0) ? ((c >> 4) - 10 + baseChar) : ((c >> 4) + '0');
        pDest[2] = ((c & 0xF) >= 0xA)? ((c & 0xF) - 10 + baseChar) : ((c & 0xF) + '0');
        pDest += 3;
        cbDest += 3;
    }
    ++pSrc;
}
//null-terminator
*pDest = '\0';
free(pUnicode);
free(pUTF8);
return TRUE;

}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
求助各位高手,帮忙做下,谢谢了
由计算机“想”一个四位数,请人猜出这个四位数是多少。人输入四位数字后,计算机首先判断这四位数字有几位是猜对了,并且在对的数字中又有几位位置也是对的,将结果显示出来,给人以提示,请人再猜,直到人猜出计算机所想的四位数是多少时为止。 
重绘标题栏闪烁问题怎么搞??
请大家帮忙!谢了~ 请大家帮忙!谢了~ 请大家帮忙!谢了~
求大神 帮忙改一下代码
&amp;lt;form action=&quot;https://www.baidu.com/s&quot;&amp;gt;&amp;lt;div align=&quot;center&quot;&amp;gt; &amp;lt;input name=tn type=hidden value=baidu&amp;gt;&amp;lt;a href=&quot;http://www.baidu.com/&quot;&amp;gt;&amp;lt;img src=&quot;https://ss0.bdsta
帮忙解决一下,谢谢了
student stu[1000];student::save(){   int i=0, k=0;ofstream outfile("stu.dll",ios::app|ios::binary); if (! outfile) {cerr  exit(1); }   while (stu[k].num!=0)k++;   for (i=0;i   {outfile.write((char *
大神帮忙优化一下
public class MoveOperate { public static void main(String[] args) { int size = 10; int s=size/2; for(int j=0;j if(j for(int i=1;i if(j>=size/2) break; System.out.print(" "); } for(in
《匆匆》朱自清
       燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们罢:那是谁?又藏在何处呢?是他们自己逃走了:现在又到了哪里呢?      在默默里算着,八千多日子已经从我手中溜去;象针尖上一滴水滴在大海里,我的日子滴在时间的流里,没有声音也没有影子。我不禁头涔涔而泪潸潸了。       我不知道他们给
请大神帮忙解答一下,急救,谢谢了
将防火墙开启(命令为systemctl   start  firewalld)并将防火墙的状态输出到一个文件中/root/a.txt,利用字符管理命令截取出active(running)
无名管道程序
大家帮忙支持一下,谢谢了。这是一个无名管道程序,亲缘进程之间的通信
一个简单游戏的程序
简单游戏的程序代码,大神们帮忙看看。简单游戏的程序代码,大神们帮忙看看。简单游戏的程序代码,大神们帮忙看看。简单游戏的程序代码,大神们帮忙看看。简单游戏的程序代码,大神们帮忙看看。
不明白的错误!各位帮忙一下!谢了!
Build Log--------------------Configuration: night - Win32 Debug--------------------Command LinesCreating temporary file "C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/RSP20.tmp" with contents[/nologo /MLd /W