前几日进行c语言练习时,做到这样一道题。
输入一句英文,自动建立二维数组并输出单词。
这道题的难度第一眼看来不大,甚至我也没有思考多久,就写出了最初的版本,但测试运行起来总发现有错误。
下面是我最初编辑的代码。
发现运用指针操作给二维数组复制之后,本应该是\0的地方却多了些莫名其妙的@或者方框。
以为是指针
操作出了问题,但当用printf调试关键数据的时候,发现数据和我预想中的一样,感觉对数据的操作也并没有问题。
正巧宿舍11点熄灯,断电了的我也只能准备睡觉,但这份未完成的代码一直在我的脑海里反复推敲。
第二天又经过反复的备注验证代码之后,以我浅薄的能力确认代码是没什么错误的,于是我就将思路想到,是不是devc++的编译问题。于是开始将解决问题的思路开拓。
终于在快下晚自习的一刹那,脑海里有了想法。
如果将每个单词的长度统计,再用for函数手动在二维数组下标为该长度的数组处添加\0结束符,是否就可以完整无错的输出某个单词了呢?
于是就有了如下代码:
#include <stdio.h>
#define max11 1024
int main()
{
char str[max11];
int len[max11]={0};
char *p=str;
char *pword[max11]; //指针数组,用于储存单词的第一个字符的地址
int i=0,i2=0,i3=0,i4=0,x=1,xxx=0; //i记录循环次数,i2记录单词个数,i3和i4组合记录单词最大长度 ,x记录指针数组的下标
printf("请输入一句英文:\n");
fgets(str,max11,stdin);
pword[0]=str; //第一个单词的地址是存放字符串数组的第一个元素的地址
for(i=0;*p!='\n';i++) //stdin 会读入换行符
{
if(*p==' ')
{
i2++;
i3=0;
while(*(p+1)==' ') //防止有多个空格
{
p++;
}
pword[x++]=(p+1); //第x个单词首字母的地址
xxx++;
}
else //记录单词最大长度
{
len[xxx]++;
i3++;
if(i3>i4)
{
i4=i3;
}
}
p++;
}
char result[i2+1][i4+1]; //建立二维数组
int x1,x2; //result[x1][x2]
//下面将每个单词存入二维数组中
for(x1=0;x1<i2+1;x1++)
{
for(x2=0;x2<i4;x2++)
{
if(*(pword[x1]+x2)!='\n' && *(pword[x1]+x2)!=' ') //当单词首字母后第x2个字符为' '或换行符
{
result[x1][x2]=*(pword[x1]+x2);
}
else
{
break;
}
}
}
printf("检索完毕,已经为您建立一result[%d][%d]的数组\n",i2+1,i4+1);//多建立一位用于存放结束符\0
printf("下面逐个输出单词:\n");
int i5; //用于存放循环次数
for(i5=0;i5<i2+1;i5++)
{
result[i5][len[i5]]='\0';
printf("%s\n", result[i5]);
}
return 0;
}
下面是测试截图:
相信一切都会变得更好的,随着学习,也渐渐理解了指针的妙用了!
希望自己的c语言道路能越走越远吧。
1 条评论
111