问题 问答题

阅读以下说明和C程序代码,将解答写在答题纸的对应栏内。

【说明】下面是一个待修改的C程序,其应该完成的功能是:对于输入的一个整数num,计算其位数k,然后将其各位数字按逆序转换为字符串保存并输出。若num为负整数,则输出字符串应有前缀"-"。例如,将该程序修改正确后,运行时若输入"14251",则输出"15241";若输入"-6319870",则输出"-0789136"。下面给出的C程序代码中有五处错误,请指出错误代码所在的行号并给出修改正确后的完整代码行。【C程序代码】

答案

参考答案:

解析:

本题考查C程序员查找错误和排除错误的基本能力。   程序中的错误主要分为语法错误和语义错误两类。   语法错误是指语言结构上的错误,例如,是否引用了未定义的变量,表达式中缺少操作数等等。语义错误是指语言结构含义不正确或程序的运算逻辑有错误,这 类错误可能在编译阶段发现(静态语义),也可能推迟到运行阶段才暴露。例如,表达式中运算符号不能处理所引用的运算对象,无穷循环等。   考生需要非常熟悉C语言的基本语法,从而通过走查源代码来发现语法错误。查找语义错误则需要充分理解程序的逻辑,也就是整个程序的结构和每条语句所起 的作用。   前2行为预处理命令行,对于最常使用的include命令,考生应该非常熟悉,以便检查程序中对常用函数的调用是否正确。本程序中前两行无错误。   显然,接下来的四行分别为mam函数的首部,函数体的开始符号"{"、变量定义语句和空白行,这里也没有错误。   第7行为格式化输入函数scanf的调用语句,这是比较容易出错的地方,常见的错误是格式控制串与输入表列中的变量不匹配,或者是丢失变量前的取地址 运算符号"&",该行的错误即在这里。   第8行至第12行用于计算所输入整数的位数并用k来计算(记录),这几行代码应作为一个整体来理解。程序中首先将num的值备份至t,并对k赋值,然 后通过循环对t进行辗转除以10的运算,使t每次都丢掉其个位数,即t的位数逐渐减少(t每减少1位,k就增加1),直到t的值为0时为止,此时k的值即 为num的位数。第9行的循环条件错误导致了无穷循环(t等于0时也继续循环),由于t的初值也可能是负数,因此应将其中的"t>=0"改 为"t!=0"。   第14行没有错误。   第15行的错误很明显,也很常见,即将"="误用为"==",从而改变其所在语句的语义,其中的"pstF=0"则将pstr的值重置为0,使 pstr所记录的字符串存储空间首地址信息丢失,此后针对pstr[]的运算都会出错。 第17行至第21行用于处理num为负数时输出字符串应包含前缀"-"的要求,这几行没有错误。第22行至第25行用于从num得到其逆置的数字字符串,其错误在第23行,属于逻辑错误。num%10的运算结果为num的个位数字,而 pstr[]中要存储的是数字字符(即ASCII值),因此应将num%10的运算结果加上字符'0'(或字符'0'的ASCII码值48)。 第26行用于设置字符串结束标志,需要注意的是串结束标志的位置。由于num可能为负数,因此将字符串结束标志字符设置在k下标处可能出错,保险的做法是 继续用i作为下标,使得'\0'正好跟在最后一个数字字符的后面。   第27行至第30行没有错误。

问答题
单项选择题