先分析那个结构体,类型名称为st,只含有两个内容,(1)一个字符c;(2)一个字符串指针s。
再解读那个函数char *f(strct st t):
这个函数的返回值是一个字符串指针,它的自变量是一个结构体变量t(类型为st)。
这的作用是什么?看内部,while(t.s[k]!='\0')是一个循环语句,它遍历t变量中的s字符串的每一个字符,干什么呢?看循环体共两句:
{if(t.s[k]==t.c)return t.s+k
k++
}
第一句是把s字符串的第k个字符与c做比较,如果相等,则返回s那个指针,只不过不是第一个字符,而是出现相等的那个字符。注意,一旦相等,就跳出这个函数啦!!
第二句则是让k加1,也就是继续比较下一个字符。
如果很不幸,一直把s的字符全部比较完,也没有一个跟c相同的,那就循环结束了,执行后面的那一句:return t.s。这一次是返回s那个指针,而且是指向第一个字符的了~~
最后分析一下主函数main,定义了一个st类型的数组a,共有4个元素,a[0]~a[3],每一个元素是都有不同的c和s都依次进行了定义。
然后是一个循环,依次用a[0]~a[3]做参数调用f函数,并打印返回的值——从前面的分析我们知道每一次调用都返回一个字符串的指针——也就是打印这个字符串,每个字符串占一行。共打印四行。
分析完程序之后,我们再来看题目:
注意题目有一点bug,21、22、23、24题的问题应该是第一、二、三、四行输出的内容,题目表述都问第一行的输出内容,那不是答案一样嘛?所以应该是题目印错了。
其实每一行输出的内容只跟结构体变量a[k]中的c和s两个变量有关。下面逐行分析:
第一行:c=1,s=123,k=0时第一个字符比较就相等了,所以返回s+k,也就是指向s的第一个字符的指针,所以输出的内容是全部s:123,是为选项C。
第二行:c=2,s=321,比较到第二个字符2(k=1)就相等了,所以返回s+1,也就是指向s的第二个字符2的指针,所以输出的内容是s从2开始的后面全部字符:21,是为选项A。
第三行:c=3,s=123,比较到第三个字符3(k=2)就相等了,所以返回s+2,也就是指向s的第三个字符3的指针,所以输出的内容是s从3开始的后面全部字符:(非常不幸只有一个)3,是为选项A。
第四行:c=4,s=321,比较到最后一个字符也没有发现4,所以返回s,也就是指向s的指针,所以输出的内容是全部s:321,是为选项D。
typedrf struct{int score[4]
} student
typedef struct node {
student data [20]
int len =3}linknode *linkp
/*手机键盘打的,用了顺序表,有需要链式结构,追问中说明,部分预处理已省略*/
void fun (int l ,linkp lp)
/*取总后直接输出,故暂不设返回值,需要,说明。*/
{int i, j, sum=0
for ( i=0i<=len -1i++){
for (j=0j<=3j++)
sum +=r->data [i].score [j]
printf ("%d",sum )}
}