{UVA} UVA-490 解题报告

 

一.   

     这道题目卡了我将近有一个星期,昨天实在忍不住才email求助刘大大.结果是数组越界. ORZ...

 

 

     总体来说,这道题目不难,构造出来的模型无非就是个2维数组,然后将第一列当做第一行输出,第二列当做第二行输出,以此类推.

 

     不过这里也有2个小细节处理: 1. 由于要控制输出的行数,因此要在输入时就判断出最长的一行的字符个数.

 

                                              2. 每一行最后的换行符不能直接输出,而要换成空格.

 

     稍微处理下这2个问题,AC这题比较简单.

 

     之所以这题卡了我这么久,是我对边界的把握不够.

 

 二.

     简要分析下:

 

     首先,由于题目中的条件给出:每一行不超过100个字符.于是我就把临时数组temp定义为100个.并且抱有侥幸心理:不会真的测试

 

     输入100个字符.

 

     但是,就是这点侥幸心理导致我一直没往这方面考虑.我们知道,当用fgets来读一行字符的时候,它会在行尾自动加上/n.因此,当输入100

 

     个字符后,再加上/n就越界了.

 

三.

    思想小结:

 

     1. 对于边界情况一定要特别留心,不要偷懒不去分析边界或者模糊地猜测.

 

    方法小结:

 

     1. 对于临时数组的大小,要比题目条件给出的略大.

 

     2. 在使用fgets的时候需要注意2点:

 

            1)若前面有scanf进行输入,要排除scanf后的换行符对fgets的影响,一般是使用getchar()或者fgetc(stdin)过滤.

 

            2)fgets会在输入的字符串后面自动加换行符.因此一定要注意此时字符串的长度问题.

               (可以自己试验:用fgets接受键盘输入的abc,再用strlen去测,发现长度是4.原因是"abc/n")

 

 

四.

    代码如下:

     

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值