| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1004 人关注过本帖
标题:如何根据输入字符多少分配内存
只看楼主 加入收藏
lu3664198
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:55
专家分:185
注 册:2014-11-16
结帖率:100%
收藏
 问题点数:0 回复次数:18 
如何根据输入字符多少分配内存
嗯,,,
大概是这样
输入  一串字符回车
计算字符
分配内存
储存字符
得到字符串首地址


我也考虑了下动态数组,但是还是搞不定...求指导
搜索更多相关主题的帖子: 字符串 如何 动态 
2014-11-22 12:38
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你考虑过“输入一串字符”这个过程之中,那一串字符存在哪里?你能够得到这一串字符,它们已经储存起来了,还用得着等你输完之后去数个数?

[ 本帖最后由 TonyDeng 于 2014-11-22 13:39 编辑 ]

授人以渔,不授人以鱼。
2014-11-22 13:38
lu3664198
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:55
专家分:185
注 册:2014-11-16
收藏
得分:0 
程序代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int i=0;
    char *cun;
    cun=(char*)malloc(1*sizeof(char));
    while((cun[i]=getchar())!='\n')
    {
        cun=(char*)realloc(cun,(i+2)*sizeof(char));
        i++;//检查指针是否为空指针
    }
    printf("输入了%d个\n",i);
    puts("逆序输出");
    for (--i;i>=0;i--)
        printf("%c",cun[i]);    
}

百度了一下,弄好了,果然问问题前要百度啊。。

wwwwwww...~~;
本人为大一新生,说的不好不要拍我 ~ ( ̄~ ̄) ;
2014-11-22 13:38
lu3664198
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:55
专家分:185
注 册:2014-11-16
收藏
得分:0 
回复 2 楼 TonyDeng
嗯,所以只能通过修改内存大小,输入一次扩大一次

wwwwwww...~~;
本人为大一新生,说的不好不要拍我 ~ ( ̄~ ̄) ;
2014-11-22 13:40
lu3664198
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:55
专家分:185
注 册:2014-11-16
收藏
得分:0 
回复 2 楼 TonyDeng
我主要还是想可以尽可能多地输入字符,而且不浪费内存

wwwwwww...~~;
本人为大一新生,说的不好不要拍我 ~ ( ̄~ ̄) ;
2014-11-22 13:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你一定要“浪费”内存!必须分配一个足够大的缓冲存储空间,让你输入未知数量的数据,但这个空间在过后是可以回收的,这样就等于没浪费内存——这就是流输入缓冲区的原理,实际上库函数如gets()、scanf()之类都是这样做了的。在输入过程结束后,把真实的数据复制到需要的空间就可以了,这个空间才是按需要分配的。换言之,为了不浪费空间,你需要多做功夫,处理两处空间,省力不省功,这是基本原理。

其实,更深入的探讨这种问题,你的愿望是徒劳的,因为所谓的不浪费空间这种微观视角,将在大量这种处理之后出现内存空洞,浪费更多的空间,带来更复杂更艰难的内存管理问题。通常,我并不鼓励你去考虑和解决这种问题,那已经是自计算机发明以来一直困扰业界的问题了,有解决这种问题潜在能力的人,都不至于在网上混。

授人以渔,不授人以鱼。
2014-11-22 13:51
lu3664198
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:55
专家分:185
注 册:2014-11-16
收藏
得分:0 
回复 6 楼 TonyDeng
Σ( ° △ °|||),
我还没学到那么入,还是新手阶段
这次主要是因为如果定义数组储存,
char[100],就想到如果输入101个字符就不行了,
所以就想到该怎么才能够大量输入字符(未知个数)

wwwwwww...~~;
本人为大一新生,说的不好不要拍我 ~ ( ̄~ ̄) ;
2014-11-22 13:57
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
程序代码:
#include <stdio.h>

int main(void){
    char *pstr = NULL;
    pstr = (char*)malloc(999999 * sizeof(char));
    printf("请输入字符串...");
    fgets(pstr,999999,stdin);
    pstr = (char*)realloc(pstr, strlen(pstr) * sizeof(char));
    printf("输入的字符串长度为:\t%d\n", strlen(pstr));
    printf("输入的字符串是:\t%s\n", pstr);
    free(pstr);
}

Only the Code Tells the Truth             K.I.S.S
2014-11-22 14:04
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
100不够,就定义1024,数组在栈上分配,函数结束后,它会自动被回收,不会浪费的。

授人以渔,不授人以鱼。
2014-11-22 14:05
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
把输入数据的代码写在一个函数中,函数使用一个足够大的缓冲区,比如char buffer[1024],然后用循环使用getchar()来读取数据(循环结束条件是getchar()读到约定的结束字符),getchar()得到的每个字符,存储在缓冲区buffer中,当函数结束时,检测buffer的有效字符数,申请堆空间,返回这个空间的地址——这个空间在外部必须记得释放!这里的关键是,缓冲区buffer在该函数结束后会自动释放,再大也没关系的。

这样写的一个函数,其实就是gets(),它也是这样做的。scanf()在接收%s类数据时,也是这样(事实是不管什么类型的数据都使用同样的缓冲区)。

[ 本帖最后由 TonyDeng 于 2014-11-22 14:21 编辑 ]

授人以渔,不授人以鱼。
2014-11-22 14:15
快速回复:如何根据输入字符多少分配内存
数据加载中...
 
   



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

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