C语言中字符串大小分配问题

软件和网站开发以及相关技术探讨
头像
Crazier
帖子: 1051
注册时间: 2007-09-23 17:06
联系:

C语言中字符串大小分配问题

#1

帖子 Crazier » 2010-09-14 8:50

是这样子的,我想实现的是 我输入多少个字符,程序就为它分配多少个字符的空间,比如:我单独输入一个 ‘a’,那程序就给它一个字符的空间,如果我输入 “fakjfiejfiajkfl2165125.fkdfjd" 那程序就给它分配这么多的 空间,请问该怎么实现?
我想了一下,实现这个功能有几种途径:
1,数组,不行!原因是数组的大小是事先指定的,会出现浪费或者不够的现象;
2, 动态分配,malloc ,也不行,原因和数组的一样,因为要指定一个分配基数的,也或者会出现再次要求分配的情况,不见得就行。
3,字符指针, 也比较困难,它还是分配一些空间才能正确指向输入的字符,要不然会出现段错误。
。。。。。。。。。。。。。

请问该怎么做?
头像
link_01
帖子: 1024
注册时间: 2008-11-05 13:24

Re: C语言中字符串大小分配问题

#2

帖子 link_01 » 2010-09-14 8:58

这么高级,不懂。
笔记
-------------------------------------
http://blog.163.com/wqt_1101
头像
Strange
帖子: 1824
注册时间: 2006-05-19 9:54
来自: Shanghai

Re: C语言中字符串大小分配问题

#3

帖子 Strange » 2010-09-14 9:40

不能实现,没有人知道你要输入多少个字符,你自己也不知道
但是可以想办法写点代码在空间不够的时候自动扩张,在c++下,这个就是std::string类
ニンニク入れますか?
x60 with gentoo
头像
linjiework
帖子: 240
注册时间: 2009-07-07 19:52

Re: C语言中字符串大小分配问题

#4

帖子 linjiework » 2010-09-14 11:16

为什么会有这种要求,好变态啊。

动态分配吧,用 malloc + realloc 。用户输入一个字符,分配一个字符空间。
阿呆 : 天下第一呆!
dshbusiness
帖子: 1831
注册时间: 2009-04-03 15:10

Re: C语言中字符串大小分配问题

#5

帖子 dshbusiness » 2010-09-14 12:02

动态分配就可以做到
poet
帖子: 2841
注册时间: 2006-09-11 22:47

Re: C语言中字符串大小分配问题

#6

帖子 poet » 2010-09-14 14:30

Crazier 写了:是这样子的,我想实现的是 我输入多少个字符,程序就为它分配多少个字符的空间,比如:我单独输入一个 ‘a’,那程序就给它一个字符的空间,如果我输入 “fakjfiejfiajkfl2165125.fkdfjd" 那程序就给它分配这么多的 空间,请问该怎么实现?
关键是看你怎么输入,办法总是有的。但是逻辑上你的程序要是合理的。
头像
Crazier
帖子: 1051
注册时间: 2007-09-23 17:06
联系:

Re: C语言中字符串大小分配问题

#7

帖子 Crazier » 2010-09-16 8:06

poet 写了:
Crazier 写了:是这样子的,我想实现的是 我输入多少个字符,程序就为它分配多少个字符的空间,比如:我单独输入一个 ‘a’,那程序就给它一个字符的空间,如果我输入 “fakjfiejfiajkfl2165125.fkdfjd" 那程序就给它分配这么多的 空间,请问该怎么实现?
关键是看你怎么输入,办法总是有的。但是逻辑上你的程序要是合理的。
输入的话,就是不断续的输入一个字符串,并没有多大的特殊。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: C语言中字符串大小分配问题

#8

帖子 eexpress » 2010-09-16 8:46

realloc 应该是差不多的意思。你自己先想想,你这需求,是为什么。
● 鸣学
头像
Crazier
帖子: 1051
注册时间: 2007-09-23 17:06
联系:

Re: C语言中字符串大小分配问题

#9

帖子 Crazier » 2010-09-16 13:17

eexpress 写了:realloc 应该是差不多的意思。你自己先想想,你这需求,是为什么。
谢谢提醒,并没有什么需求,只是自己实验搞着玩的,想着即不浪费空间,又能快速的保存长度不定的字符串。
poet
帖子: 2841
注册时间: 2006-09-11 22:47

Re: C语言中字符串大小分配问题

#10

帖子 poet » 2010-09-16 18:39

Crazier 写了:
poet 写了:
Crazier 写了:是这样子的,我想实现的是 我输入多少个字符,程序就为它分配多少个字符的空间,比如:我单独输入一个 ‘a’,那程序就给它一个字符的空间,如果我输入 “fakjfiejfiajkfl2165125.fkdfjd" 那程序就给它分配这么多的 空间,请问该怎么实现?
关键是看你怎么输入,办法总是有的。但是逻辑上你的程序要是合理的。
输入的话,就是不断续的输入一个字符串,并没有多大的特殊。
你还不明白么?

你用什么函数去接收输入?

你用什么空间去接收传入的字符?

你分配空间,是在“调用输入函数之前”,而你输入,是在调用输入函数之后。

你如何在调用函数的时候预测将输入多少字符?

所以说,逻辑上要想明白了,剩下的问题就好做了。
头像
Crazier
帖子: 1051
注册时间: 2007-09-23 17:06
联系:

Re: C语言中字符串大小分配问题

#11

帖子 Crazier » 2010-09-16 19:45

poet 写了:
Crazier 写了:
poet 写了:
Crazier 写了:是这样子的,我想实现的是 我输入多少个字符,程序就为它分配多少个字符的空间,比如:我单独输入一个 ‘a’,那程序就给它一个字符的空间,如果我输入 “fakjfiejfiajkfl2165125.fkdfjd" 那程序就给它分配这么多的 空间,请问该怎么实现?
关键是看你怎么输入,办法总是有的。但是逻辑上你的程序要是合理的。
输入的话,就是不断续的输入一个字符串,并没有多大的特殊。
你还不明白么?

你用什么函数去接收输入?

你用什么空间去接收传入的字符?

你分配空间,是在“调用输入函数之前”,而你输入,是在调用输入函数之后。

你如何在调用函数的时候预测将输入多少字符?

所以说,逻辑上要想明白了,剩下的问题就好做了。
我不得不说你说的很到位,这是我写的小程序,实现从输入的字符串提取数字并输出,字符串的长度取决于你当时的心情,你看看能怎么修改一下。

代码: 全选

#include<ctype.h>
#include<string.h>
#include<stdlib.h>

int main(void)
{
    int i=0, j=0, num, len;
    char *str, *temp,test[500];
    str = test;
    printf("Input your string:\n");
    scanf("%s", str);
    printf("%s",str);
    len = strlen(str);
    printf("stringlenth %d\n",len);
    temp = (char *)malloc( len * sizeof(char) );
    
    for(i=0; str[i] != '\0'; i++){
        if( isdigit(str[i]) ){
            temp[j++] = str[i];
            if ( !isdigit(str[i+1]) ){
                temp[j] = '\0';
                num = atoi(temp);
                printf("%d    ", num);
                j = 0;
            }
            }
        }
    return 0;
}
kse8107
帖子: 31
注册时间: 2009-03-07 16:06

Re: C语言中字符串大小分配问题

#12

帖子 kse8107 » 2010-10-04 19:03

代码: 全选

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
	char *tmp = (char*)malloc(sizeof(char));
	int cnt =0;
	while(scanf("%c", tmp)){
		if(*tmp == '\n'){
			printf("strlen:%d\n", cnt);
			cnt=0;
		}
		else{
			cnt++;
			/*add your codes here*/
			if(isdigit(*tmp))
				printf("%c\n", *tmp);
		}
	}
	return 0;
}
这样会不会好些,为什么都要存起来呢。。其实如果一定要把数据储存起来的话可以在每读入一个char的时候进行长度的改变,可以自己创建一个链表一样的数据结构来做,不过空间上就变成了cnt*(sizeof(char)+sizeof(char*))了。如果一定要严格跟输入字符一样的话可以在每个循环里做一个realloc。。但是感觉那样很丑,一大堆realloc系统调用可能还没有自己做的链表效率高。

是不是人一放假精力就不集中了,怎么老写错别字啊
上次由 kse8107 在 2010-10-04 19:28,总共编辑 3 次。
头像
冲浪板
论坛版主
帖子: 7513
注册时间: 2007-05-06 8:19

Re: C语言中字符串大小分配问题

#13

帖子 冲浪板 » 2010-10-04 19:06

字节数量应该比你给的多一个吧,哈

弄不好就算一个漏洞,嘎嘎
头像
Crazier
帖子: 1051
注册时间: 2007-09-23 17:06
联系:

Re: C语言中字符串大小分配问题

#14

帖子 Crazier » 2010-10-08 19:26

kse8107 写了:

代码: 全选

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
	char *tmp = (char*)malloc(sizeof(char));
	int cnt =0;
	while(scanf("%c", tmp)){
		if(*tmp == '\n'){
			printf("strlen:%d\n", cnt);
			cnt=0;
		}
		else{
			cnt++;
			/*add your codes here*/
			if(isdigit(*tmp))
				printf("%c\n", *tmp);
		}
	}
	return 0;
}
这样会不会好些,为什么都要存起来呢。。其实如果一定要把数据储存起来的话可以在每读入一个char的时候进行长度的改变,可以自己创建一个链表一样的数据结构来做,不过空间上就变成了cnt*(sizeof(char)+sizeof(char*))了。如果一定要严格跟输入字符一样的话可以在每个循环里做一个realloc。。但是感觉那样很丑,一大堆realloc系统调用可能还没有自己做的链表效率高。

是不是人一放假精力就不集中了,怎么老写错别字啊
谢谢你这么投入,写了这么多,我好好思考思考,一时的兴趣造就了这么多麻烦呀。。。 :em24
kse8107
帖子: 31
注册时间: 2009-03-07 16:06

Re: C语言中字符串大小分配问题

#15

帖子 kse8107 » 2010-10-08 23:48

Crazier 写了:
kse8107 写了:

代码: 全选

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
	char *tmp = (char*)malloc(sizeof(char));
	int cnt =0;
	while(scanf("%c", tmp)){
		if(*tmp == '\n'){
			printf("strlen:%d\n", cnt);
			cnt=0;
		}
		else{
			cnt++;
			/*add your codes here*/
			if(isdigit(*tmp))
				printf("%c\n", *tmp);
		}
	}
	return 0;
}
这样会不会好些,为什么都要存起来呢。。其实如果一定要把数据储存起来的话可以在每读入一个char的时候进行长度的改变,可以自己创建一个链表一样的数据结构来做,不过空间上就变成了cnt*(sizeof(char)+sizeof(char*))了。如果一定要严格跟输入字符一样的话可以在每个循环里做一个realloc。。但是感觉那样很丑,一大堆realloc系统调用可能还没有自己做的链表效率高。

是不是人一放假精力就不集中了,怎么老写错别字啊
谢谢你这么投入,写了这么多,我好好思考思考,一时的兴趣造就了这么多麻烦呀。。。 :em24
……其实你可以理解成我最近比较无聊。。 :em06
回复