鱼C论坛

 找回密码
 立即注册
查看: 4744|回复: 8

指针数组,多字符串输入问题?

[复制链接]
发表于 2015-3-19 00:41:59 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 haiouda 于 2015-3-22 11:22 编辑

#include <stdio.h>
#if(1)
int main()
{
char *p[30];
p[0]="China";
p[1]="man";
printf("%s %s\n",p[0],p[1]);
#endif;
}








上面这段程序,定义了30个指针组成的,指针数组,前二个指针指向了字符串,还有28个指针没有指向字符串,如何实现动态输入(在程序运行中输入)28个字符串,让其它的指针,指向输入的28个字符串;这个就是我要,求教的问题,谢谢。
******************************************************************************
下面第 4 楼,第二个问题,求助 :handshake
下面第 5 楼,对程序进行了改进,可三楼的第二个问题,怎么解决一点思路也没有,请求指点::handshake



最佳答案

查看完整内容

首先说,想节省空间,相对的一般要用时间来换,提一种思路解决你说的问题 借用链表的方法 上面这段代码的错误在于,新建的结构体结点内的str指针未初始化,不能用于scanf函数中,可以改变它的指向,为了达到楼主所说的节省空间,代码改为下面这样 链表的好处是每当你输入一个新的字符串你都可以创建一个新的结点去存储它,然后链接到链表的头部或者尾部即可(头插和尾插),坏处是不能随机查找(即按位置取值),但是 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-3-19 00:42:00 | 显示全部楼层
本帖最后由 lightninng 于 2015-3-20 09:16 编辑
haiouda 发表于 2015-3-19 14:41
这个的缺点是:1)不输入1000个字串不能退出(这个可以自己解决);
                             ...

首先说,想节省空间,相对的一般要用时间来换,提一种思路解决你说的问题
借用链表的方法
typedef struct LNode
{
    char *str;
    struct Node *next;
}LNode;
main()
{
        LNode *head = NULL;#用于记录头结点的位置
        LNode *p =NULL,*pre = NULL; 
        char *temp_str; #用于暂时存放输入的字符串
        for (i=0;i<1000;i++)
        {
            p = (LNode *)malloc(sizeof(LNode));#p指向新生成的结点    
                        scanf("%s",temp_str);
                        p->str = temp_str;
                        p->next = head;
                        head = P;#头插法生成链表                        
        }
        #以下为冒泡法排序
        int i,j;
        for(i = 1000; i > 0; i--)
                p = head;
                pre = NULL;
                for(j = 0; j < i; j++)
                        if(strcmp(p->str,p->next->str)>0)
                        {
                                #若p指向结点所存字符串比后一结点的大刚交换两者位置
                                if(pre)
                                {
                                        head = p->next;#若p指向头结点则在交换结点位置前需要更改头指针的指向
                                }
                                else
                                {
                                        pre->next = P->next;#若p未指向头结点则在交换结点位置前先要将p前一结点的指针指向新的位置
                                }
                                #交换p和p下一个结点的位置
                                pre = p->next;
                                p->next = pre->next;
                                pre->next = p;
                        }                
                        else
                        {
                                #反之则将p和pre指针后移继续检查后继结点
                                pre = p, p = p->next        
                        }
        #按排好的顺序输出字符串
        for(p = head; p; p = p->next)
                printf("%s", p->str);
}
上面这段代码的错误在于,新建的结构体结点内的str指针未初始化,不能用于scanf函数中,可以改变它的指向,为了达到楼主所说的节省空间,代码改为下面这样
typedef struct LNode
{
    char *str;
    struct Node *next;
}LNode;
main()
{
        LNode *head = NULL;#用于记录头结点的位置
        LNode *p =NULL,*pre = NULL; 
                
                
        for (i=0;i<1000;i++)
        {
                        int str_len,count;
                        char temp_char;
                        char* temp_str = (char*)malloc(sizeof(char*) * 5); 
                        for(int i = 0; i < 1000; i++)
                        {
                                #这段代码用于创建一个申请空间等于输入字符数的字符串
                                str_len = 5,count = 0;
                                printf("Please input a string: ");
                                temp_str = (char*)malloc(temp_str, sizeof(char*) * 5);
                                do 
                                {
                                        temp_char = getchar();
                                        count++;
                                        if (count >= str_len)
                                                temp_str = (char*)realloc(temp_str, sizeof(char*) * (++str_len));
                                        temp_str[count-1] = temp_char;
                                } while (temp_char != '\n');
                                temp_str[count] = '\0';
                                #将得到的字符串的首地址赋于结点p中的str指针
                                p = (LNode *)malloc(sizeof(LNode));#p指向新生成的结点            
                p->str = temp_str;
                p->next = head;
                head = P;#头插法生成链表   
                        }
        }
        #以下为冒泡法排序
        int i,j;
        for(i = 1000; i > 0; i--)
                p = head;
                pre = NULL;
                for(j = 0; j < i; j++)
                        if(strcmp(p->str,p->next->str)>0)
                        {
                                #若p指向结点所存字符串比后一结点的大刚交换两者位置
                                if(pre)
                                {
                                        head = p->next;#若p指向头结点则在交换结点位置前需要更改头指针的指向
                                }
                                else
                                {
                                        pre->next = P->next;#若p未指向头结点则在交换结点位置前先要将p前一结点的指针指向新的位置
                                }
                                #交换p和p下一个结点的位置
                                pre = p->next;
                                p->next = pre->next;
                                pre->next = p;
                        }                
                        else
                        {
                                #反之则将p和pre指针后移继续检查后继结点
                                pre = p, p = p->next        
                        }
        #按排好的顺序输出字符串
        for(p = head; p; p = p->next)
                printf("%s", p->str);
}


链表的好处是每当你输入一个新的字符串你都可以创建一个新的结点去存储它,然后链接到链表的头部或者尾部即可(头插和尾插),坏处是不能随机查找(即按位置取值),但是题目要求只是顺序输出字符串,冒泡法也只用比较相邻的结点数据,相对来说比较好用,其实,这么麻烦的实现方法,楼主还不如直接多申请点空间保存你的字符串
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-3-19 09:15:45 | 显示全部楼层
书上有题目,照着改就行了,这样才能进步。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-3-19 14:41:57 | 显示全部楼层
本帖最后由 haiouda 于 2015-3-19 14:54 编辑
ANDES 发表于 2015-3-19 09:15
书上有题目,照着改就行了,这样才能进步。

     这个的缺点是:1)不输入1000个字串不能退出(这个可以自己解决);
                               2)输入的字符串长度,最长为29个字符(由二维数组确定),输入不够浪费空间,输入超了无效;

  第二个问题哪位能指点下怎么修改,谢谢:handshake ;  还有,我试着让数组指针,指向二维数组,可只能第一个字符串指给,打针数组,后面的二者地址就不一样了,无奈,才在for 语句中,一对 一的指定;问下 这里,还有更好的办法么?
#include <stdio.h>
#include <string.h>
#define xx 1000
int main()
{
        void pxx(char *b[],int n);
        int i;
        char p[xx][30],*a[xx];
        
        for (i=0;i<xx;i++)
        {
                a[i]=p[i];
        scanf("%s",a[i]);
        }
   
   pxx(a,xx);



        for (i=0;i<xx;i++)
        {
        printf("%s ",a[i]);
                
        }
        printf("\n");

 return 0;

}

void pxx(char *b[],int n)
{
        int i,k;
        char *temp;
        for (i=n;i>0;i--)
        {
                for(k=0;k<i-1;k++)
                if(strcmp(b[k],b[k+1])>0)
                {
                        temp=b[k]; b[k]=b[k+1]; b[k+1]=temp;

                }
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-3-19 16:37:40 | 显示全部楼层
haiouda 发表于 2015-3-19 14:41
这个的缺点是:1)不输入1000个字串不能退出(这个可以自己解决);
                             ...

改变 XX 的值就行了,不要1000,这样就可以了。一对一的赋值是对的,好像这样最简单。  建议代码打完要把每行代码都进行注释,方便别人阅读你的代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-3-19 21:51:21 | 显示全部楼层
本帖最后由 haiouda 于 2015-3-19 21:57 编辑
#include <stdio.h>
#include <string.h>
#define xx 1000
int main()
{
        void pxx(char *b[],int n);    //声明函数 用于从小到大排列数组
        int i,k;
        char p[xx][30],*a[xx];

        printf("请输入字符串,按下回车表示一个字符串输入完毕,连续按三次回车表示所有字符串输入完毕:");
        for (i=0;i<xx;i++)
        {
                a[i]=p[i];                //二次数组与指针数组建立关系
                
                
                for (k=0;k<30;k++)         //输入字符串
                {
                        p[i][k]=getchar();
                        if(p[i][k]=='\n')      //每一次回车,表明一个字符串输入完成
                        {
                                p[i][k]='\0';
                                break;
                        }
                }
                if ( a[i]=="" && a[i-1]=="" && a[i-2]=="")
                {
                        break;
                }
                
                        
        }
        
        printf("\n\n");
        pxx(a,xx);
        
        
        
        for (i=0;i<xx;i++)         //打印排序后的字符串
        {
                printf("%s\n",a[i]);
                
        }
        printf("\n");
        
        return 0;
        
}

void pxx(char *b[],int n)     //函数定义
{
        int i,k;
        char *temp;
        for (i=n;i>0;i--)
        {
                for(k=0;k<i-1;k++)
                        if(strcmp(b[k],b[k+1])>0)
                        {
                                temp=b[k]; b[k]=b[k+1]; b[k+1]=temp;
                                
                        }
        }
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-3-19 23:32:02 | 显示全部楼层

看楼上的贴子,不一定对,不过我尽力了,在学python手头没有c的编译环境,所以楼主自己试一下吧~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-3-20 08:42:10 | 显示全部楼层
本帖最后由 haiouda 于 2015-3-20 08:49 编辑
lightninng 发表于 2015-3-19 23:32
看楼上的贴子,不一定对,不过我尽力了,在学python手头没有c的编译环境,所以楼主自己试一下吧~

谢谢回复;
终于有思路了 :handshake
看来只有继续看下去,不停留在针指这里才能找到解决的方法,不过有思路就好 {:1_1:}


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-3-20 09:17:50 | 显示全部楼层
haiouda 发表于 2015-3-20 08:42
谢谢回复;
终于有思路了
看来只有继续看下去,不停留在针指这里才能找到解决的方法,不过 ...

恩。c语言字符串和指针的部分是精华。但是也是难点。基本难一点的问题都出在这里。我觉得我的方法可能还是有些问题。给你回答问题自己了学到了很多。一起加油吧~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 19:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表