题目
45,下面程序的运行结果是()#include< stdio. h>main()(char a[ ] = "morning" ,t;int i,j=0;for(i=1;i< 7;i+ +)if(a[j] < a[i] )j=i;t=a[j] ;a[j] =a[7] ;a[7] =a[j] ;puts(a); ) A. mogninrB. moC. morningD. morning
45,下面程序的运行结果是()#include< stdio. h>main(){char a[ ] = "morning" ,t;int i,j=0;for(i=1;i< 7;i+ +)if(a[j] < a[i] )j=i;t=a[j] ;a[j] =a[7] ;a[7] =a[j] ;puts(a); }
- A. mogninr
- B. mo
- C. morning
- D. morning
题目解答
答案
B
解析
考查要点:本题主要考查字符串数组的边界处理、字符比较逻辑以及数组越界对程序运行结果的影响。
解题核心思路:
- 数组越界:题目中数组
a的长度为7("morning"包含7个字符),但代码尝试访问a[7],导致越界。 - 字符比较逻辑:循环遍历数组,找出最大字符的位置
j。 - 交换操作:尝试交换
a[j]和a[7],但由于越界,实际可能将空字符写入数组,导致字符串提前终止。
破题关键点:
- 数组越界是本题的核心陷阱,需理解越界访问可能导致不可预测的结果。
- 字符串输出规则:
puts(a)会输出从a[0]开始的字符,直到遇到空字符\0停止。
步骤1:初始化数组与变量
char a[] = "morning",数组长度为7,有效索引为0~6,存储字符m, o, r, n, i, n, g。j = 0,初始假设最大字符为a[0](即'm')。
步骤2:循环找出最大字符的位置
for(i=1; i<7; i++):遍历索引1~6。- 比较逻辑:若当前字符
a[i]大于a[j],则更新j = i。 - 实际过程:
i=1,a[1]='o' > 'm'→j=1。i=2,a[2]='r' > 'o'→j=2。- 后续字符
'n', 'i', 'n', 'g'均小于'r',j保持2。
- 最终结果:
j=2(最大字符'r'的位置)。
步骤3:交换操作
t = a[j]→t = 'r'。- 越界访问:
a[j] = a[7]:a[7]超出数组范围,读取到随机值(假设为\0)。a[7] = t:将'r'写入a[7](可能覆盖后续内存)。
- 数组状态:
a[2]被设为\0,原数组变为m, o, \0, n, i, n, g。
步骤4:输出结果
puts(a)从a[0]开始输出,遇到\0停止,最终输出"mo"。