1.目的:
输入: I’m a student
输出: student a I’m
2.思考
(1)另开一个空间对字符串进行切割存储
(2)开一个二维数组对字符串进行存储
(3)二维数组的行数最多和字符串的字符个数相当
int Inverse(char str[],char str[][N])
{
int num=;
int i;
int j=;
for(int i=;i<=strlen(str1);i++)//条件判断:当恰好读到str1的\0时,是正好相等,最后一个\0,靠这个条件补上,必须带等号)
{
if(str1[i]==' ')
{
str2[num][j]='\0';//补充\0以后会被当做字符串进行处理
num++;//对下一行进行写入
j=0;//重置j,让j从起始位置开始
}
else
{
str2[num][j]=str1[i];
j++;}
}
return (num+1);//num从零开始,所以要加一,才是总行数
}
int main (void)
{
char str1[N];
char str2[N][N];
int len,num;
int i;
char note;
printf("input a sentence:");
gets(str1);
num=Inverse(str1,str2);//函数功能:把字符串分割并存储;
for(i=num-1;i>=0;i--)
{
printf("%s",str2[i]);
}
return 0;
}
//下面要把str2以逆序的方式写入str1中,方案1:遍历一维数组
void write(int str1[],str2[][N])//
{
int hang=num;
int j=0;
for(int i=0;i<strlen(str1);i++)
{
if(str2[hang][j]=='\0')//读到每一行结束的时候
{
a[i]=' ';//添加空格
hang--;//第二个数组换行
j=0;//重置列数
}
else
{
a[i]=str2[hang][j];//正常读入
j++;//向后移位
}
}
a[i]='\0';
return ;
}
//边界分析:(1)边界条件:读入的是字符串长度减一,最后一个\0是长度最后的位置,不会被读入,直接在为str1\0的位置跳出了循环;(2)for(int i=0;i<=strlen(str1);i++) 当读到最后一位的时候,对应的二维数组是'\0‘,但是此时我们给str1赋值了一个空格,不是'\0',最后还是要另赋值。//(3)最后那个i不要再加一了,最后一次循环有加。(4)要是弄不明白直接加两个’\0',不会影响结果,但是不推荐。
//错误分析:不应该从第一行开始遍历,而是应该从最后一行开始遍历。(已经改正)