在VS2015下出现运行异常,但是在CB和Linux下运行正常
在VS2015下出现运行错误,但是在CB和Linux下运行正常
//替换空格
//将一个字符串中的空格替换成“%20”
#include <iostream>
#include <cstring>
using namespace std;
void replaceSpace(char *str, int length)
{
int count = 0;
char *strTemp;
for (int i = 0; i < length; i++)
{
if (str[i] == ' ')
{
count++;
}
}
strTemp = new char[length + count * 3];
for (int i = 0,j = 0; i < (length + count * 3); i++,j++)
{
if(str[j] != ' ')
strTemp[i] = str[j];
else
{
strTemp[i] = '%';
i++;
strTemp[i] = '2';
i++;
strTemp[i] = '0';
}
}
strncpy(str, strTemp, (length + count * 3));
}
int main()
{
int n;
char str[] = "we are happy";
replaceSpace(str, strlen(str));
cout << str << endl;
return 0;
}
在VS2015下将strncpy(str, strTemp, (length + count * 3));替换成
strncpy_s(str, (length + count * 3), strTemp, (length + count * 3));
其实我也怀疑可能有越界问题,但是GCC编译运行是正常的,求解
------解决思路----------------------
肯定越界了撒, str 分配的长度就是原始字符串的大小,你替换后的字符串明显更长了,还往原来那里面拷贝
------解决思路----------------------
定义成
char str[1024/*足够大的数*/]="...";
就好了
------解决思路----------------------
替换过后字符串的长度大于最初的,明显会越界,越界之后的行为是无法预测的;只因为你的代码比较简短,str越界后的区域恰好没有被用到,所以有时候碰运气结果会看上去没问题。正确的写法应该预料足够的空间:
//替换空格
//将一个字符串中的空格替换成“%20”
#include <iostream>
#include <cstring>
using namespace std;
void replaceSpace(char *str, int length)
{
int count = 0;
char *strTemp;
for (int i = 0; i < length; i++)
{
if (str[i] == ' ')
{
count++;
}
}
strTemp = new char[length + count * 3];
for (int i = 0,j = 0; i < (length + count * 3); i++,j++)
{
if(str[j] != ' ')
strTemp[i] = str[j];
else
{
strTemp[i] = '%';
i++;
strTemp[i] = '2';
i++;
strTemp[i] = '0';
}
}
strncpy(str, strTemp, (length + count * 3));
}
int main()
{
int n;
char str[] = "we are happy";
replaceSpace(str, strlen(str));
cout << str << endl;
return 0;
}
在VS2015下将strncpy(str, strTemp, (length + count * 3));替换成
strncpy_s(str, (length + count * 3), strTemp, (length + count * 3));
其实我也怀疑可能有越界问题,但是GCC编译运行是正常的,求解
------解决思路----------------------
肯定越界了撒, str 分配的长度就是原始字符串的大小,你替换后的字符串明显更长了,还往原来那里面拷贝
------解决思路----------------------
定义成
char str[1024/*足够大的数*/]="...";
就好了
------解决思路----------------------
替换过后字符串的长度大于最初的,明显会越界,越界之后的行为是无法预测的;只因为你的代码比较简短,str越界后的区域恰好没有被用到,所以有时候碰运气结果会看上去没问题。正确的写法应该预料足够的空间:
char str[32] = "we are happy";