C语言中字符串大小分配问题
- Crazier
- 帖子: 1051
- 注册时间: 2007-09-23 17:06
- 联系:
C语言中字符串大小分配问题
是这样子的,我想实现的是 我输入多少个字符,程序就为它分配多少个字符的空间,比如:我单独输入一个 ‘a’,那程序就给它一个字符的空间,如果我输入 “fakjfiejfiajkfl2165125.fkdfjd" 那程序就给它分配这么多的 空间,请问该怎么实现?
我想了一下,实现这个功能有几种途径:
1,数组,不行!原因是数组的大小是事先指定的,会出现浪费或者不够的现象;
2, 动态分配,malloc ,也不行,原因和数组的一样,因为要指定一个分配基数的,也或者会出现再次要求分配的情况,不见得就行。
3,字符指针, 也比较困难,它还是分配一些空间才能正确指向输入的字符,要不然会出现段错误。
。。。。。。。。。。。。。
请问该怎么做?
我想了一下,实现这个功能有几种途径:
1,数组,不行!原因是数组的大小是事先指定的,会出现浪费或者不够的现象;
2, 动态分配,malloc ,也不行,原因和数组的一样,因为要指定一个分配基数的,也或者会出现再次要求分配的情况,不见得就行。
3,字符指针, 也比较困难,它还是分配一些空间才能正确指向输入的字符,要不然会出现段错误。
。。。。。。。。。。。。。
请问该怎么做?
- link_01
- 帖子: 1024
- 注册时间: 2008-11-05 13:24
- Strange
- 帖子: 1824
- 注册时间: 2006-05-19 9:54
- 来自: Shanghai
Re: C语言中字符串大小分配问题
不能实现,没有人知道你要输入多少个字符,你自己也不知道
但是可以想办法写点代码在空间不够的时候自动扩张,在c++下,这个就是std::string类
但是可以想办法写点代码在空间不够的时候自动扩张,在c++下,这个就是std::string类
ニンニク入れますか?
x60 with gentoo
x60 with gentoo
- linjiework
- 帖子: 240
- 注册时间: 2009-07-07 19:52
-
- 帖子: 1831
- 注册时间: 2009-04-03 15:10
Re: C语言中字符串大小分配问题
动态分配就可以做到
-
- 帖子: 2841
- 注册时间: 2006-09-11 22:47
Re: C语言中字符串大小分配问题
关键是看你怎么输入,办法总是有的。但是逻辑上你的程序要是合理的。Crazier 写了:是这样子的,我想实现的是 我输入多少个字符,程序就为它分配多少个字符的空间,比如:我单独输入一个 ‘a’,那程序就给它一个字符的空间,如果我输入 “fakjfiejfiajkfl2165125.fkdfjd" 那程序就给它分配这么多的 空间,请问该怎么实现?
- Crazier
- 帖子: 1051
- 注册时间: 2007-09-23 17:06
- 联系:
Re: C语言中字符串大小分配问题
输入的话,就是不断续的输入一个字符串,并没有多大的特殊。poet 写了:关键是看你怎么输入,办法总是有的。但是逻辑上你的程序要是合理的。Crazier 写了:是这样子的,我想实现的是 我输入多少个字符,程序就为它分配多少个字符的空间,比如:我单独输入一个 ‘a’,那程序就给它一个字符的空间,如果我输入 “fakjfiejfiajkfl2165125.fkdfjd" 那程序就给它分配这么多的 空间,请问该怎么实现?
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
- Crazier
- 帖子: 1051
- 注册时间: 2007-09-23 17:06
- 联系:
Re: C语言中字符串大小分配问题
谢谢提醒,并没有什么需求,只是自己实验搞着玩的,想着即不浪费空间,又能快速的保存长度不定的字符串。eexpress 写了:realloc 应该是差不多的意思。你自己先想想,你这需求,是为什么。
-
- 帖子: 2841
- 注册时间: 2006-09-11 22:47
Re: C语言中字符串大小分配问题
你还不明白么?Crazier 写了:输入的话,就是不断续的输入一个字符串,并没有多大的特殊。poet 写了:关键是看你怎么输入,办法总是有的。但是逻辑上你的程序要是合理的。Crazier 写了:是这样子的,我想实现的是 我输入多少个字符,程序就为它分配多少个字符的空间,比如:我单独输入一个 ‘a’,那程序就给它一个字符的空间,如果我输入 “fakjfiejfiajkfl2165125.fkdfjd" 那程序就给它分配这么多的 空间,请问该怎么实现?
你用什么函数去接收输入?
你用什么空间去接收传入的字符?
你分配空间,是在“调用输入函数之前”,而你输入,是在调用输入函数之后。
你如何在调用函数的时候预测将输入多少字符?
所以说,逻辑上要想明白了,剩下的问题就好做了。
- Crazier
- 帖子: 1051
- 注册时间: 2007-09-23 17:06
- 联系:
Re: C语言中字符串大小分配问题
我不得不说你说的很到位,这是我写的小程序,实现从输入的字符串提取数字并输出,字符串的长度取决于你当时的心情,你看看能怎么修改一下。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;
}
-
- 帖子: 31
- 注册时间: 2009-03-07 16:06
Re: C语言中字符串大小分配问题
代码: 全选
#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;
}
是不是人一放假精力就不集中了,怎么老写错别字啊
上次由 kse8107 在 2010-10-04 19:28,总共编辑 3 次。
- 冲浪板
- 论坛版主
- 帖子: 7513
- 注册时间: 2007-05-06 8:19
Re: C语言中字符串大小分配问题
字节数量应该比你给的多一个吧,哈
弄不好就算一个漏洞,嘎嘎
弄不好就算一个漏洞,嘎嘎
- Crazier
- 帖子: 1051
- 注册时间: 2007-09-23 17:06
- 联系:
Re: C语言中字符串大小分配问题
谢谢你这么投入,写了这么多,我好好思考思考,一时的兴趣造就了这么多麻烦呀。。。kse8107 写了:这样会不会好些,为什么都要存起来呢。。其实如果一定要把数据储存起来的话可以在每读入一个char的时候进行长度的改变,可以自己创建一个链表一样的数据结构来做,不过空间上就变成了cnt*(sizeof(char)+sizeof(char*))了。如果一定要严格跟输入字符一样的话可以在每个循环里做一个realloc。。但是感觉那样很丑,一大堆realloc系统调用可能还没有自己做的链表效率高。代码: 全选
#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; }
是不是人一放假精力就不集中了,怎么老写错别字啊

-
- 帖子: 31
- 注册时间: 2009-03-07 16:06
Re: C语言中字符串大小分配问题
……其实你可以理解成我最近比较无聊。。Crazier 写了:谢谢你这么投入,写了这么多,我好好思考思考,一时的兴趣造就了这么多麻烦呀。。。kse8107 写了:这样会不会好些,为什么都要存起来呢。。其实如果一定要把数据储存起来的话可以在每读入一个char的时候进行长度的改变,可以自己创建一个链表一样的数据结构来做,不过空间上就变成了cnt*(sizeof(char)+sizeof(char*))了。如果一定要严格跟输入字符一样的话可以在每个循环里做一个realloc。。但是感觉那样很丑,一大堆realloc系统调用可能还没有自己做的链表效率高。代码: 全选
#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; }
是不是人一放假精力就不集中了,怎么老写错别字啊
