| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 674 人关注过本帖
标题:很多问题应该 二级指针啊等
只看楼主 加入收藏
烟雾中的迷茫
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:621
专家分:1069
注 册:2011-2-9
收藏
得分:0 
问题基本解决但是还有逻辑问题  我回继续修改弄好 了 就再贴上来
大家动用你们的智慧 继续想想优化方案吧及不足之处
2011-09-06 22:45
烟雾中的迷茫
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:621
专家分:1069
注 册:2011-2-9
收藏
得分:0 
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(int argc,char *argv[])
{
    unsigned int num;                             //  num up to 100000
    int i,j,n,mark=1,k,len;                               //  各标记
    char **ch=NULL,*pstr=NULL;                               //  字符指针存放指针

    printf("请输入电话号码数!\n");
    scanf("%d\n",&num);

    ch=(char **)malloc(20*sizeof(char));                     //  外加
    for(i=0;i<num;i++)
    {
        *(ch+i)=(char *)malloc(20*sizeof(char));     //  动态分配内存
        gets(ch[i]);
    }

     // 处理号码中的大写字母
    for(i=0;i<num;i++)
    {
        len=strlen(ch[i]);
        for(j=0;j<len;j++)
        {
            n=ch[i][j];
            switch(n)
            {
            case 65: case 66: case 67:
                ch[i][j]='2';break;
            case 68: case 69: case 70:
                ch[i][j]='3';break;
            case 71: case 72: case 73:
                ch[i][j]='4';break;
            case 74: case 75: case 76:
                ch[i][j]='5';break;
            case 77: case 78: case 79:
                ch[i][j]='6';break;
            case 80: case 82: case 83:
                ch[i][j]='7';break;
            case 84: case 85: case 86:
                ch[i][j]='8';break;
            case 87: case 88: case 89:
                ch[i][j]='9';break;
            default:  break;
            }
            
        }
        // 除去字符串中的'-'
        for(j=0;j<len;j++)
            if(ch[i][j]=='-')
                for(k=j+1;k<len;k++)
                    ch[i][k-1]=ch[i][k];
        // 插入连接符
        for(j=len-1;j>3;j--)
            ch[i][j+1]=ch[i][j];
        ch[i][j]='-';
        ch[i][len+1]='\0';
    }
        // 按照字典中字母顺序输出
        for(i=0;i<num;i++)
        {
            pstr=ch[i];
            for(j=i;j<num-1;j++)
            {
                if(strcmp(ch[i],ch[j+1])<0)
                    pstr=ch[j+1];
                else
                     if(strcmp(ch[i],ch[j+1])==0)
                {
                    mark++;
                    pstr=ch[j+1];
                }
            }

             if(mark==1)
             {
                 printf("%s",pstr);
                 printf("  No duplicates \n");
             }
             else
                 printf("%s  %d\n",pstr,mark);
              mark=1;            
        }
        return 0;
}


第一次修改 存在逻辑问题  我继续修改 大家路过的顺便说句吧 呵呵
2011-09-06 22:46
czsbc
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:469
专家分:1700
注 册:2008-12-13
收藏
得分:0 
回复 5楼 烟雾中的迷茫
老兄,你的二级指针还没有搞明白吧,你有num个电话号码,自然要有num个指针还指向它们呀,
本来如果可以的话,应该是char *ch[num]的,但是[]中不能为变量,自然不能这么用,所以分配num*sizeof(char *)大小的空间来存这num个指针,如果按你的那样,最多只能输入20个电话号码了。

[ 本帖最后由 czsbc 于 2011-9-6 23:08 编辑 ]
2011-09-06 23:03
czsbc
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:469
专家分:1700
注 册:2008-12-13
收藏
得分:20 
回复 12楼 烟雾中的迷茫
楼主,你看清楚了,二级指针分配内存时应该是sizeof(char *) 好吧   
2011-09-06 23:07
烟雾中的迷茫
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:621
专家分:1069
注 册:2011-2-9
收藏
得分:0 
嗯.不错!第一个应该分配Char*、没认真看了)不错…继续呵呵
2011-09-06 23:43
烟雾中的迷茫
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:621
专家分:1069
注 册:2011-2-9
收藏
得分:0 
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(int argc,char *argv[])
{
    unsigned int num;                             //  num up to 100000
    int i,j,n,mark=0,k,len;                               //  各标记
    char **ch=NULL,*pstr=NULL,*mid=NULL;                               //  字符指针存放指针

    printf("请输入电话号码数!\n");
    scanf("%d\n",&num);

    ch=(char **)malloc(num*sizeof(char*));                     //  外加
    for(i=0;i<num;i++)
    {
        *(ch+i)=(char *)malloc(20*sizeof(char));     //  动态分配内存
        gets(ch[i]);
    }

     // 处理号码中的大写字母
    for(i=0;i<num;i++)
    {
        len=strlen(ch[i]);
        for(j=0;j<len;j++)
        {
            n=ch[i][j];
            switch(n)
            {
            case 65: case 66: case 67:
                ch[i][j]='2';break;
            case 68: case 69: case 70:
                ch[i][j]='3';break;
            case 71: case 72: case 73:
                ch[i][j]='4';break;
            case 74: case 75: case 76:
                ch[i][j]='5';break;
            case 77: case 78: case 79:
                ch[i][j]='6';break;
            case 80: case 82: case 83:
                ch[i][j]='7';break;
            case 84: case 85: case 86:
                ch[i][j]='8';break;
            case 87: case 88: case 89:
                ch[i][j]='9';break;
            default:  break;
            }
            
        }
        // 除去字符串中的'-'
        for(j=0;j<strlen(ch[i]);j++)
            if(ch[i][j]=='-')
            {
                for(k=j+1;k<strlen(ch[i]);k++)
                    ch[i][k-1]=ch[i][k];
                ch[i][k]='\0';
            }
        // 插入连接符
        for(j=strlen(ch[i])-1;j>3;j--)
            ch[i][j+1]=ch[i][j];
        ch[i][j]='-';
        ch[i][strlen(ch[i])+1]='\0';
    }
        // 按照字典中字母顺序输出
        for(i=0;i<num;i++)
        {
            if(ch[i]!=NULL)
                  pstr=ch[i];

            for(j=i;j<num-1;j++)
                if(strcmp(ch[i],ch[j+1])<0)
                    pstr=ch[j+1];

            strcpy(mid,ch[i]);  strcpy(ch[i],pstr); strcpy(pstr,mid);

            for(k=i;k<num;k++)
                if(strcmp(pstr,ch[k])==0)
                {
                    ch[k]=NULL;
                    mark++;
                }


             if(mark==1)
             {
                 printf("%s",pstr);
                 printf("  No duplicates \n");
             }
             else
                 printf("%s  %d\n",pstr,mark);
              mark=1;            
        }
    return 0;
}


修改到这个地方了 改正了其中一些逻辑错误 但是问题又来了 崩溃了...///~~~~继续改了
2011-09-07 13:13
czsbc
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:469
专家分:1700
注 册:2008-12-13
收藏
得分:0 
还没改好,楼主继续努力呀,晚上回来再看看!
2011-09-07 13:17
烟雾中的迷茫
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:621
专家分:1069
注 册:2011-2-9
收藏
得分:0 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(int argc,char *argv[])
{
    unsigned int num;                             //  num up to 100000
    int i,j,n,mark=0,k,len,sign;                               //  各标记
    char **ch=NULL,*pstr=NULL;                               //  字符指针存放指针

    printf("请输入电话号码数!\n");
    scanf("%d\n",&num);
   
    if(num==0)
        printf("NO DATA!\n");

    ch=(char **)malloc(num*sizeof(char*));                     //  外加
    for(i=0;i<num;i++)
    {
        *(ch+i)=(char *)malloc(100*sizeof(char));     //  动态分配内存
        gets(ch[i]);
    }

     // 处理号码中的大写字母
    for(i=0;i<num;i++)
    {
        len=strlen(ch[i]);
        for(j=0;j<len;j++)
        {
            n=ch[i][j];
            switch(n)
            {
            case 65: case 66: case 67:
                ch[i][j]='2';break;
            case 68: case 69: case 70:
                ch[i][j]='3';break;
            case 71: case 72: case 73:
                ch[i][j]='4';break;
            case 74: case 75: case 76:
                ch[i][j]='5';break;
            case 77: case 78: case 79:
                ch[i][j]='6';break;
            case 80: case 82: case 83:
                ch[i][j]='7';break;
            case 84: case 85: case 86:
                ch[i][j]='8';break;
            case 87: case 88: case 89:
                ch[i][j]='9';break;
            default:  break;
            }
            
        }
        // 除去字符串中的'-'
        sign=strlen(ch[i]);
        for(j=0;j<strlen(ch[i]);)
            if(ch[i][j]=='-'&&ch[i][j+1]!='-')
            {
                for(k=j+1;k<strlen(ch[i]);k++)
                    ch[i][k-1]=ch[i][k];
                sign--;
            }
            else if(ch[i][j]=='-'&&ch[i][j]=='-')
                     for(k=j+1;k<strlen(ch[i]);k++)
                     {
                       ch[i][k-1]=ch[i][k+1];
                       sign-=2;
                     }
                else if(ch[i][j]=='-')
                    j=0;
                else
                    j++;
        ch[i][sign]='\0';
        // 插入连接符
        for(j=strlen(ch[i])-1;j>2;j--)
            ch[i][j+1]=ch[i][j];
        ch[i][3]='-';
        ch[i][8]='\0';
    }
        // 按照字典中字母顺序输出
        for(i=0;i<num;i++)
        {
            if(ch[i]!=NULL)
                  pstr=ch[i];
            else continue;

            for(k=i+1;k<num;k++)
                if(strcmp(pstr,ch[k])==0)
                {
                    ch[k]=NULL;
                    mark++;
                }

            if(mark==0)
             {
                 printf("%s",pstr);
                 printf("  No duplicates \n");
             }
             else
                 printf("%s  %d\n",pstr,mark+1);
            mark=0;            
        }
    return 0;
}
花了 将近两天散的时间 代码基本改好了  但是在效率 健壮性等方面 还为改进 有兴趣的可以继续改了 呵呵
2011-09-07 16:56
烟雾中的迷茫
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:621
专家分:1069
注 册:2011-2-9
收藏
得分:0 
顺便 总结一下 对测试代码发表下自己 在这过程中的体会吧
  测试代码确实是一个细活 要又耐心 坐得住  呵呵 不过我还没做到
  其实我也是想表达下自己的观点  对于那些刚开始学的人来说 要从开始就
  懂得并学会测试自己的代码 这个过程是值得享受的  在这论坛上有各位大打
  做我们的后盾 我们只要勇敢向前即可
  其实我贴这么多代码的一个原因是想让像我一样刚学的人 体会下代码测试过程
  值知道 正确的好的 高效代码 他们写的出来 一部分原因是一遍一遍的调试测试
  
  再说下我这次测试过程中用的方法
  其实除了用调试器之外(这次没用呵呵)
  我这次用的方法是分段检测(名字自己叫的呵呵)
  也就是说 我这段代码每次测试的时候 都分成一段一段来测试(排除外因) 调试好这段后
  再调下一段一次进行下去
  
  欢迎各位挚友 评论 发表意见  大家共同进步


  码字真晕啊  呵呵呵呵

[ 本帖最后由 烟雾中的迷茫 于 2011-9-7 17:08 编辑 ]
2011-09-07 17:04
快速回复:很多问题应该 二级指针啊等
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028010 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved