前几日进行c语言练习时,做到这样一道题。
输入一句英文,自动建立二维数组并输出单词。

这道题的难度第一眼看来不大,甚至我也没有思考多久,就写出了最初的版本,但测试运行起来总发现有错误。
测试.png

下面是我最初编辑的代码。
程序截图1.png
程序截图2.png
程序截图3.png

发现运用指针操作给二维数组复制之后,本应该是\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;
 } 

下面是测试截图:
最终测试.png

相信一切都会变得更好的,随着学习,也渐渐理解了指针的妙用了!
希望自己的c语言道路能越走越远吧。

最后修改:2021 年 10 月 09 日
如果觉得我的文章对你有用,请随意赞赏