问题 问答题 案例分析题

阅读以下问题说明、C程序和函数,将解答填入答题纸的对应栏内。

【问题1】分析下面的C程序,指出错误代码(或运行异常代码)所在的行号。【C程序】

【问题2】函数inputArr(inta[],intn)的功能是输入一组整数(输入0或输入的整数个数达到n时结束)存入数组a,并返回实际输入的整数个数。函数inputArr可以成功编译。但测试函数调用inputArr后,发现运行结果不正确。请指出错误所在的代码行号,并在不增加和删除代码行的情况下进行修改,写出修改正确后的完整代码行,使之符合上述设计意图。【C函数】

答案

参考答案:

[试题1] 5,或arrChar=”test” 7,或*p=‘0’; [试题2]

 

解析:

本题考查C程序编写和调试中常见错误的识别和改正。  问题1分析:在C语言中,指针表示内存单元的地址,指针变量可用于存储指针类型的值,即内存单元的 地址值。变量的值在程序运行过程中允许修改,而常量则不允许修改。可以令指针指向一个变量或常量,但若指针指向一个常量,则不允许通过指针修改该常量。   第5行代码有错,即对数组名arrChar的赋值处理是错误的。在C语言中,数组名是表示数组空间首地址的指针常量,程序中不允许对常量赋值。  第7 行代码有错,在第6行中,通过p="testing"使指针变量指向了一个字符串常量,此后可以再令指针p指向其他字符或字符串,但不能通过指针修改字符 串常量的内容。  问题2分析:该函数中出现的错误是编写C程序时的常见错误。scanf是C标准库函数中的格式化输入函数,其原型如下:     使用时,第一个实参是格式控制串,之后的实参是地址1,地址2,……  在本题中,要求以十进制整数格式输入一个整数并存入a[k],数组元素a[k] 实质上一个整型变量,必须用"&"求得a[k]的地址作为实参调用scanf函数,因此,第4行出错,正确代码应 为"scanf("%d",&a[k]);"。  C程序中将相等运算符"=="误用为赋值运算符"="也是常见的一个错误,由于"="也是合法 的运算符并且C语言中用0和非0来表示逻辑假和逻辑真,因此在应产生逻辑值的地方产生了其他数值也可以,因此该错误通常只能用人工检查和排除。第6行的正 确代码应为"if(k==n )break;"。  在该程序中,结束循环的一个条件是k等于n,另一个条件是输入的整数为0。另外,do-while的循环条件为真(非0)时要继续 循环,因此,循环条件应该是判断输入的值不等于0。观察循环体中与数组元素有关的部分,如下所示:    也就是说输入为0时存入了a[k],而循环判断条件"a[k]==0"中的a[k]相对于刚存入了0的数组元素来说已经是a[k+1]了,因此正确的条件为"a[k-1] !=0"。

单项选择题