VC++6.0南开100里的f(p)=p*11 mod 256题目,用unsigned char定义出错!
发布网友
发布时间:2022-12-28 04:28
我来回答
共1个回答
热心网友
时间:2023-10-22 01:59
*****
*****Step1:回答问题
“用unsigned char定义出错!”的原因。因为程序中用到了一个字符串求长函数strlen,strlen的函数原型是:
unsigned long strlen(const char *str);
//注意,它只能对char型的字符数组求长,你要是用unsigned char类型的字符数组作为实参传递给这个函数,自然会报错!
*****
*****Step2:改错
很简单,还原成原来的char型就可以了。这样的话,程序能运行通过,结果也有了,可是如何检查结果的正确性呢?无论你直接在VC6.0调出的控制台(DOS窗口),还是用各种软件(包括Notepad.exe、Uedit32.exe)打开输出文件ps58.dat,其中都包含部分乱码,再高的VC高手也看不懂。难道程序的运行结果无从验证?答案是:不!我不清楚老师怎么给你验证、评分,但我有自己的验证方法。
*****
*****Step3:验证方法(设计)
程序在保存结果到文件ps58.dat时调用了WriteDat()函数,WriteDat()定义如下:
{
FILE *fp;
int i;
//system("CLS"); ‘聚焦1’
fp=fopen("OUT65.DAT","w");
for(i=0;i<maxline;i++)
{
//printf("%s\n",xx[i]); ‘聚焦2’
Print(xx[i],strlen(xx[i]),'d');‘聚焦3’
fprintf(fp,"%s\n",xx[i]);
}
fclose(fp);
}
我标明了三个聚焦点,聚焦第1个地方:我把这句注释掉,因为要验证答案,自然需要对多次显示结果进行比较,不能让它自动清屏。聚焦第2个地方:我把这句也注释掉,因为就是这句,让控制台输出的字符串成了乱码。聚焦第3个地方:这是关键,在这调用一个自己写的打印函数,来打印一个给定的字符串,并且确保打印结果无乱码。
*****
*****Step4:验证方法(实现)
能够正确打印字符串的函数Print的原型及定义如下:
void Print( char str[], int n, unsigned char format)
{
int j,count;
unsigned char output;
switch( format)
{
case 'd':
for(j=0;j<n;j++)
{
output = str[j];
printf("%4d", output);
}
printf("\n");
break;
case 'c':
for(j=0;j<n;j++)
printf("%4c", str[j]);
printf("\n");
break;
case 's':
printf("%s\n",str);
break;
default:
break;
}
}
把这个函数拷贝至WriteDat()之前。然后运行程序..........
结果如何?估计还有很多人还很迟疑,这算什么验证啊?!
*****
*****Step5:验证方法可行性分析
所谓编程,特别是用C语言编程,本质都是在跟数字打交道。这些数字中,出现最频繁的是整数、字符,字符本质上也是整数。所有,归根结底,大部分程序目的在于处理整数。回到这个题上面来,'聚焦3'那条语句就是以无符号整形数格式来显示结果,同样在调用编码函数encryChar之前,也可以先调用这个Print函数查看编码之前的数值,这样就可以形成编码前后数值的对比,进而验证结果。
*****
*****Step5:清除验证痕迹
验证结果正确无误后,请确保把新加的Print函数删除干净,然后还原程序中WriteDat函数中的三个聚焦点。
*****
*****补充回答:
另外附上经过严格测试的本题答案:
void encryChar(void)
{
int i,j,k; /*定义循环控制变量*/
int str; /*存储字符串的长度*/
char ch; /*定义字符暂存变量*/
unsigned char temp; /*定义计算结果变量*/
/* 必须定义成:unsigned char ,非常关键!*/
for(i=0;i<maxline;i++)
/*以行为单位获取字符*/
{
/*求得当前行的字符串长度*/
str=strlen(xx[i]);
/*将第一个字符暂存入ch*/
ch=xx[i][0];
for(j=0;j<str-1;j++)
{
temp = xx[i][j] * 11 % 256; /*编码计算*/
if (temp%2 || temp<=32 ) /*判断中间结果是否符号替换条件*/
{
/*不符合,原字符不变,跳到下一个字符编码*/
continue;
}//if
xx[i][j] = temp; /*符合替换条件,则替换*/
}//for(j)
}//for(i)
}//encryChar()
注:在VC中,“//”是行注释符号,它可以注释其后的一整行代码。
快考试了,祝你好运!
参考资料:自己琢磨的。