学会自己细化指针方面的具体操作
下面是一道题。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//要求:利用一个func函数,访问下列数组中的元素,并且将能够修改的元素打印出来。
//自己做到的仅仅只是,利用一个函数对字符数组进行访问和修改
int main()
{
int i,j;
printf("改变前的是:\n");
char str1[] = "aaarr1";
printme(str1);
char str2[] = "aaaaarr2";
printme(str2);
char str3[] = "aaaarr3";
printme(str3);
char str4[] = "aaaaaarr4";
printme(str4);
char str5[] = "aaarr5";
printme(str5);
char str6[] = "arr6";
printme(str6);
printf("改变后的:\n");
change(str1,strlen(str1));
change(str2,strlen(str2));
change(str3,strlen(str3));
change(str4,strlen(str4));
change(str5,strlen(str5));
change(str6,strlen(str6));
printf("str1-str6改变完成\n");
char* a[][3] = {str1,str2,"aaaarr3",str4,str5,str6};*("aaaarr3"+2);
char* b[][3] = {"bb2222","bb2","bb3","bb4","bb5","bb6","bb7","bb8","bb9"};
char* c[][3] = {"cc","cc","cc"};
/* printf("c开始\n");
for(i = 0; i < strlen(c)/strlen(c[0]);i++)
{
for(j = 0; j < strlen(c[0]);j++)
printf("%s\t",c[i][j]);
printf("\n");
}
printf("c完成!\n");*/
//printf(* b[1]);
char*(*arr[])[3]={a,b,c};//*(p+i) == a
changePrint(arr,3,2,3,1);
return 0;
}
void printme(char * str)
{
printf("%s\n",str);
}
void change(char * str, int n)
{
int i = 0;
for(i = 0; i < n; i++)
{
*(str+i) = 't';
}
printf("%s\n",str);
n = 0;
i = 0;
}
而正确的方式应该是:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void changePrint( char*(*(*p))[3],int arrLen,int aLen,int bLen,int cLen )
{
int i;//控制1层,arr
int jRow,jCol;//控制2层,abc
int k;//控制3层,str1-str6
//打印所有字符串
int len[3] = {aLen,bLen,cLen};
for(i = 0;i<arrLen;i++)//(p+i)
{
//printf("%p\n",*(p+i));//访问arr每个元素
for(jRow = 0;jRow<len[i];jRow++) //*(p+i)+jRow
{
for(jCol = 0;jCol<3;jCol++)//*(*(p+i)+jRow)+jCol
{
printf( "%s\t",*(*(*(p+i)+jRow)+jCol));//元素的值是字符串地址
}
/*char* *(*(*(p+i)+jRow)+jCol); "abcdefg";
*(*(*(*(*(p+i)+jRow)+jCol))+1);
*(*(*(*(p+i)+jRow)+jCol)+1);*/
printf("\n");
}
printf("\n");
}
//获取str长度
int lenstr[6];
for(i = 0;i<1;i++)
{
k = -1;
for(jRow = 0;jRow<2;jRow++)
{
for(jCol = 0;jCol<3;jCol++)
{
k=k+1;//k的值每次加1,总共加6次,加到5为止,即作为数组的lenstr的第六个元素
lenstr[k] = strlen((*(*(*p+jRow)+jCol)));//获取str1-str6数组的长度,并且赋给数组lenstr,方便后期的修改操作
//注意:此处犯的错误是,先选择了用sizeof()来测试数组长度,导致的结果是在下面的修改str1-str6里面的字符,仅仅只是修改了前四个
/*printf("**************\n");
printf("%d\n",lenstr[k]);//此处是用来测试我们所获取的长度,并打印出来
printf("**************\n");*/
}
}
}
//修改str1-str6的字符串
int m = 0;
//int len[3] = {aLen,bLen,cLen};
for(i = 0;i<1;i++)//a
{
k = -1;
for(jRow = 0;jRow<len[i];jRow++) //a[0]
{
for(jCol = 0;jCol<3;jCol++)//a[0][0]
{
k = k+1;//6次
for(m = 0; m < lenstr[k]; m++)//依次访问lenstr里面的每一个数字,也就是str1-str6的长度
*(*(*(*(p+i)+jRow)+jCol)+m) = 't';//将str1-str6里面的每一个字符改为t
}
}
}
//修改后打印所有字符串
for(i = 0;i<arrLen;i++)//(p+i)
{
//printf("%p\n",*(p+i));//访问arr每个元素
for(jRow = 0;jRow<len[i];jRow++) //*(p+i)+jRow
{
for(jCol = 0;jCol<3;jCol++)//*(*(p+i)+jRow)+jCol
{
// *(*(p+i)+jRow)+jCol 元素的地址
printf( "%s\t",*(*(*(p+i)+jRow)+jCol));//元素的值是字符串地址
}
printf("\n");
}
printf("\n");
}
}
int main()
{
char str1[] = "aaarr1";
char str2[] = "aaaaarr2";
//printf("str2:%d\n",sizeof(str2));
char str3[] = "aaaarr3";
char str4[] = "aaaaaarr4";
char str5[] = "aaarr5";
char str6[] = "arr6";
char* a[][3] = {str1,str2,str3,str4,str5,str6};
//printf("%d\n",size((*((a+1)+1)));
char* b[][3] = {"bb2222","bb2","bb3","bb4","bb5","bb6","bb7","bb8","bb9"};
//printf("%d\n",strlen(**b));
char* c[][3] = {"cc","cc","cc"};
char*(*arr[])[3]={a,b,c};//*(p+i) == a
changePrint(arr,3,2,3,1);
return 0;
}
上面的程序,遇到的问题是:学会分析,逐步进行分析,先有逻辑上的思维。然后逐步细化过程。实现访问是大哥讲解的,后面自己在实现修改的过程中,同样遇到了问题,困扰自己的是获取里面数组长度,刚开始全部采用的是sizeof(),因此仅仅只能修改前四个,而后面改为strlen()来获取数组长度时,才知道问题所在。先梳理逻辑,再进一步实现功能。
上述的程序只是初稿,在我看来,还有可以优化的可能性。