问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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中,“//”是行注释符号,它可以注释其后的一整行代码。

快考试了,祝你好运!

参考资料:自己琢磨的。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
友情就像碳酸是什么意思? 江西省大余到广州坐汽车要多久,哪个人知道告诉我。拜托!!! 从武汉坐火车到江西大余怎样坐? 5 5 5 1=24在中间填四则运算符号怎么填? 比如是5*5那些的 可以用括号... 1 5 5 5=24 5 1 5 5 =24 填上运算符号与括号 使算式成立 ...1四个数字,用加,减,乘,除,括号串联起来,结果得24,每个数字只能用一次... C语言 中间的那段代码输入空格后按回车没反应啊 C语言求解 统计字符的个数 请问我的代码怎么修改才能去掉输入前的空格... 英雄联盟新界面怎么说话,找不到发射的按钮啊 国家图书馆的web驱动程序怎么关闭啊 gridview页面加入上搜索功能的问题 页面上只有一个GridView控件,这个控件在页面加载时执行DateBind()方法绑 使用收缩水对皮肤有损害吗? 房贷下来了合同能不能请人代领 买房贷款合同必须本人领吗 隆阳区附近哪里有VR培训班哪家比较好? kankan.xunlei.com 新电影《画皮》那个网站可以观看全集 ?!~~~· 声波震动牙刷和电动牙刷哪种好 声波牙刷和电动牙刷哪个好?声波牙刷和电动牙刷的区别 上海秀创国际少儿模特怎么样 上海外籍模特多少钱一小时? 上海一女装店“壮硕模特”展示服装引热议,怎样拒绝身材焦虑? 模特马艳丽现在在上海吗? 怎样使海带快速煮烂? 望海潮(八月十五日钱塘观潮)原文_翻译及赏析 柳永《望海潮》原文翻译 钓鱼发烧友怎么和好友聊天 望海潮原文_翻译及赏析 江西04建筑消耗量定额中,如何将现浇砼该换商品砼,有没有套好的截图看看。广联达计价软件 大连口碑好的少儿英语有多少家,都在哪? 甄嬛传片头曲为什么用菩萨蛮 硬盘的转数是不是越快越好?还有缓存是什么? 退货时快递单号是什么? 我用PPLIVE的时候,缓冲设置为10秒,但每次都要等上几分钟才开始,请问哪位高手知道如何解决 为什么打开浏览器总要有10秒中的等待 中兴v880 在软件里 直接退出来到主菜单的时候 要缓冲10多秒 是怎么回事? 谁能帮我解决我的 cctv news中看视频总是要缓冲 每隔10秒就缓冲的问题 我的电脑网速是1m的 有什么其他的软 网页下载时,等待10秒的时候不动,导致无法下载. 为什么在百度文库中缓冲速度比它的下载速度慢的多,也就是等它全部缓冲完要十秒左右但是下载就需要两三秒 红米手机闪退如何解决 机械员资格证难考吗 飞机机械师证难考吗 华为账号一天能申请几次 家长设置和平精英密码忘记了怎么办 深圳高速公路股份有限公司是国企吗 春游需要准备哪些东西 生石膏粉做豆腐的技巧是什么 怎么制作韭菜盒子 小学生练字入门怎么教程