首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于sprintf_s,弹出Expression:(“Buffer too small”,0)有关问题

2012-05-04 
关于sprintf_s,弹出Expression:(“Buffer too small”,0)问题直接上程序,程序很简单是找出2n位数的吸血鬼数

关于sprintf_s,弹出Expression:(“Buffer too small”,0)问题
直接上程序,程序很简单是找出2n位数的吸血鬼数的总数。
#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <cstring>
#include <cmath>

bool sort(char * num,int totalNum);

int _tmain(int argc, _TCHAR* argv[])
{
clock_t start,finish;
start = clock();

int DIGIT;//用来表示吸血鬼数字的位数
std::cout<<"请输入吸血鬼的位数:";
std::cin>>DIGIT;

int SMALLNUM = pow((float)10,DIGIT/2-1);//符合吸血鬼数的乘积的因子的最小数。例如对于4位吸血鬼数,其为10
int LARGENUM = SMALLNUM * 10; //符合吸血鬼数的乘积的因子的最大数,且多1。例如对于4位吸血鬼数,其为100
int FIRSTNUM = pow((float)10,DIGIT-1);//符合吸血鬼数的第一个可能的数。例如对于4位吸血鬼数,其为1000
  int LARSTNUM = FIRSTNUM * 10;////符合吸血鬼数的最后一个可能的数,再+1。例如对于4位吸血鬼数,其为10000

//动态分配内存 这边调试能动态分配内存,没有发现问题
char *numSum = new char[DIGIT+1];
char *numPro = new char[DIGIT+1];

int count=0;
for(int i = SMALLNUM;i < LARGENUM;i++)
{
for(int j = i+1;j < LARGENUM;j++)
{
if(i * j < FIRSTNUM || i * j > LARSTNUM)
continue;
else
{
//memset(numSum,'0',sizeof(numSum));
//memset(numPro,'0',sizeof(numPro));
sprintf_s(numPro,DIGIT,"%d",i*j); //程序调试到这里就异常了,此时i = 11,j = 91,DIGIT = 4,求取4位数的吸血鬼数,到这就弹出Expression:(“Buffer too small”,0)
sprintf_s(numSum,DIGIT,"%d%d",i,j);
if(sort(numPro,DIGIT) && sort(numSum,DIGIT))
if(!strcmp(numPro,numSum))
{
printf("%d = %d * %d\n",i*j,i,j);
count++;
}
}
}
}
std::cout<<"吸血鬼数一共:"<<count<<"个"<<std::endl;
delete []numSum;
delete []numPro;
  finish = clock();
std::cout<<"一共花费:"<<(finish - start)<<"ms"<<std::endl;
std::cin.get();
return 0;
}

bool sort(char * num,int totalNum)
{
  char temp;
for(int i = 0;i < totalNum-2;i++)
for(int j = totalNum-2;j > i;j--)
{
if (num[j] < num[j-1])
{//sort from small to large
temp = num[j];
num[j] = num[j-1];
num[j-1] = temp;
}
}
return true;
}
补充一下:吸血鬼数是指位数为偶数的数字,可以由一对数字相乘而得到,
而这对数字各包含乘积的一半位数的数字,其中从最初的数字
中选取的数字可以任意排序。以两个0结尾的数字是不允许的,
例如1260=21*60
坐等高手求救

[解决办法]
sprintf_s(numPro,DIGIT,"%d",i*j);
应该是DIGIT+1把,sprintf是带结束符的把
[解决办法]
sprintf_s(numPro,DIGIT+1,"%d",i*j); 
sprintf_s(numSum,DIGIT+1,"%d%d",i,j);
[解决办法]

探讨
静态分配确实不错,不过这麻烦找了,我就很纠结应该怎么把它解决掉,SOS

引用:

请不要动态分配内存自找麻烦,静态分配一个足够大的
#define MAXBUFFERLEN 10000
static char numPro[MAXBUFFERLEN];

热点排行