c语言,藏头诗改错并说明错误原因。
更新时间2018-05-16 13:12:44
顺便请解释一下问什么定义函数的形参
char *s[ ]是一维的,可在t[ i ] = s[i][0];显然把他当成二维的,这样对吗
4
hello
oil
parent
education
hope
源程序:
#include <stdio.h>
#include <stdlib.h>
char * change(char *s[ ], int n);
int main(void)
{
int i,n;
char poem[8][20], *p[8];
scanf("%d",&n);
for(i = 0; i < n; i++){
scanf("%s",poem[i]);
p[i] = poem[i];
}
printf("%s
", change(poem, n));
return 0;
}
char * change(char *s[ ], int n)
{
int i;
char *t = (char *)malloc(9 * sizeof(char));
for(i = 0; i < n; i++)
t[ i ] = s[i][0];
return t;
}
形参写成char *s[ ]是不对的,char *s[ ]其实相当于char **s; 和二维数组并不等价
二维数组作形参可以写成:
char * change(char s[8][20], int n);
其实数组的行无关紧要,写了实际也不会限制什么,可以省略成:
char * change(char s[][20], int n);
还可以写成:
char * change(char (*s)[20], int n);
注意一定要把*s括起来,因为[]的优先级比*的优先级高,这种形式的声明参数是一个指针,它指向具有10个元素的一维数组
如果去掉*s的括号,这时候参数相当于是声明了一个数组,该数组有10个元素,其中每个元素都是一个指向整型对象的指针
注意二维数组的第二维大小不能省略,否则系统无法决定应为多少行多少列
还有一个错误,数组t没有初始化,输出字符串可能会多一些乱码,或者在循环后面加一个
t[i] = '