在线编译器 C

#include<stdio.h> int main() { int arr[10]; int res[10]; int a=0; int i; int b; for(i=0;i<10;i++){ scanf("%d",&arr[i]); } for(i=0;i<10;i++){ b=(arr[i]/10)%10; if(b==0){ res[i]=arr[i]; a++; } } for(i=0;i<a;i++){ printf("%d ",res[i]); } return 0; }
这段代码的功能是:读取10个整数,然后找出其中十位数字为0的数,并按照原顺序输出这些数。

代码的主要逻辑是:
- 先读取10个数存入数组arr
- 然后遍历arr,对每个数计算其十位数字(通过除以10再取模10),如果十位是0,就把这个数存入另一个数组res,并计数a
- 最后输出res数组中的前a个数

代码存在一个逻辑问题:当某个数的十位不是0时,res数组对应位置没有被赋值,但后续输出时只输出前a个元素,这本身没问题。不过更关键的是,如果第一个数的十位不是0,那么res[0]就没有被赋值,但后续输出时如果a>0,会输出未初始化的值。

- 提示1:考虑一下,如果第一个数的十位不是0,但第二个数的十位是0,那么res[0]会被赋值为第二个数吗?检查一下res数组的索引和arr数组的索引是否应该独立。
- 提示2:思考一下,当遇到十位为0的数时,应该存入res的哪个位置?当前代码使用i作为res的索引,但i是arr的索引,这会导致res数组中可能有未赋值的空隙。