分页: 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系统调用可能还没有自己做的链表效率高。
是不是人一放假精力就不集中了,怎么老写错别字啊
谢谢你这么投入,写了这么多,我好好思考思考,一时的兴趣造就了这么多麻烦呀。。。

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系统调用可能还没有自己做的链表效率高。
是不是人一放假精力就不集中了,怎么老写错别字啊
谢谢你这么投入,写了这么多,我好好思考思考,一时的兴趣造就了这么多麻烦呀。。。

……其实你可以理解成我最近比较无聊。。
