分页: 1 / 2

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

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

请问该怎么做?

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

发表于 : 2010-09-14 8:58
link_01
这么高级,不懂。

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

发表于 : 2010-09-14 9:40
Strange
不能实现,没有人知道你要输入多少个字符,你自己也不知道
但是可以想办法写点代码在空间不够的时候自动扩张,在c++下,这个就是std::string类

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

发表于 : 2010-09-14 11:16
linjiework
为什么会有这种要求,好变态啊。

动态分配吧,用 malloc + realloc 。用户输入一个字符,分配一个字符空间。

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

发表于 : 2010-09-14 12:02
dshbusiness
动态分配就可以做到

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

发表于 : 2010-09-14 14:30
poet
Crazier 写了:是这样子的,我想实现的是 我输入多少个字符,程序就为它分配多少个字符的空间,比如:我单独输入一个 ‘a’,那程序就给它一个字符的空间,如果我输入 “fakjfiejfiajkfl2165125.fkdfjd" 那程序就给它分配这么多的 空间,请问该怎么实现?
关键是看你怎么输入,办法总是有的。但是逻辑上你的程序要是合理的。

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

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

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

发表于 : 2010-09-16 8:46
eexpress
realloc 应该是差不多的意思。你自己先想想,你这需求,是为什么。

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

发表于 : 2010-09-16 13:17
Crazier
eexpress 写了:realloc 应该是差不多的意思。你自己先想想,你这需求,是为什么。
谢谢提醒,并没有什么需求,只是自己实验搞着玩的,想着即不浪费空间,又能快速的保存长度不定的字符串。

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

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

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

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

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

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

所以说,逻辑上要想明白了,剩下的问题就好做了。

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

发表于 : 2010-09-16 19:45
Crazier
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;
}

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

发表于 : 2010-10-04 19:03
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系统调用可能还没有自己做的链表效率高。

是不是人一放假精力就不集中了,怎么老写错别字啊

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

发表于 : 2010-10-04 19:06
冲浪板
字节数量应该比你给的多一个吧,哈

弄不好就算一个漏洞,嘎嘎

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

发表于 : 2010-10-08 19:26
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

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

发表于 : 2010-10-08 23:48
kse8107
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