多个不固定长度的字符串怎么存储?

yinrongg 2012-07-20 11:10:15
假设有N个不固定的字符串:
“1234”
“3434”
“”
“CSDN论坛”
“———————较长的字符串————————”
.
.
.
现在需要用用数组进行存储,使用char[][]还是char * []呢? 能说说理由吗
...全文
712 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2012-07-20
  • 打赏
  • 举报
回复
char* *str_table; 自己悟一下怎么实现吧,将会用到:

strdup, realloc.
zjwdmlmx 2012-07-20
  • 打赏
  • 举报
回复
要是对效率要求不高的话可以用C++呀 用vector list deque等加string,事实上如果运用得当,而且操作不复杂用C++ STL库会比C直接操作内存要高效的 嘿嘿
Linux-Torvalds 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 1 楼 的回复:

个人的看法是,如果不用写,可以选择char* [],如果要写,选择char [][]
你说的写是什么意思?我定义完后要对他进行赋值算写吗? 能说说你的理由吗
[/Quote]
char* name[4] = { "aaa", "bbb", "ccc", "ddd" };
name[0][0] = 'x'; // error
baichi4141 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

我的意思表达的不够好,我是说遇到这情况选择用char * [] 还是用 char[][],哪个更好,或者有其他的更好的方法。请大家说说理由。
[/Quote]
3楼已经说了
抛弃数组,使用指针,动态申请内存
分两层申请,每个字符串申请一段内存保存在指针里,这是第二层,专门申请一段内存保存这些指针,这是第一层
因为长度不定,因为数量不定,动态申请比数组要灵活得多
yinrongg 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

理由参考本ID的星星数。(^_^)
[/Quote] 嘿嘿,请教下,使用char * []会不会省点内存空间啊?
yinrongg 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

C/C++ code
#define MAXN 10000 //最多字符串数
#define MAXLEN 128 //每个字符串包含最多字符数127+1个字符串末尾标志'\0'
static STRs[MAXN][MAXLEN];
[/Quote] 我问这个问题主要是考虑到内存使用问题,因为我是单片机使用。呵呵
赵4老师 2012-07-20
  • 打赏
  • 举报
回复
理由参考本ID的星星数。(^_^)
赵4老师 2012-07-20
  • 打赏
  • 举报
回复
#define MAXN 10000 //最多字符串数
#define MAXLEN 128 //每个字符串包含最多字符数127+1个字符串末尾标志'\0'
static STRs[MAXN][MAXLEN];
yinrongg 2012-07-20
  • 打赏
  • 举报
回复
我的意思表达的不够好,我是说遇到这情况选择用char * [] 还是用 char[][],哪个更好,或者有其他的更好的方法。请大家说说理由。
yinrongg 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

C/C++ code
char s[N][MAX];
char *s[N];

是这样?
[/Quote] 是的,哪个用法好些?
yinrongg 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

个人的看法是,如果不用写,可以选择char* [],如果要写,选择char [][]
[/Quote] 你说的写是什么意思?我定义完后要对他进行赋值算写吗? 能说说你的理由吗
baichi4141 2012-07-20
  • 打赏
  • 举报
回复
char * a = ( char * ) malloc( sizeof ( char ) * ... )
char ** b = ( char ** ) malloc( sizeof( char * ) * ... )
DataChat.Club 2012-07-20
  • 打赏
  • 举报
回复
char s[N][MAX];
char *s[N];

是这样?
Linux-Torvalds 2012-07-20
  • 打赏
  • 举报
回复
个人的看法是,如果不用写,可以选择char* [],如果要写,选择char [][]
shaode01 2012-07-20
  • 打赏
  • 举报
回复
从temp.txt中读入未知的字符串,动态申请空间[Quote=引用 20 楼 的回复:]

C/C++ code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* const argv[]) { //动态载入内存
FILE *fpt;
char line[100];
char* *str_table = NULL;
int size ……
[/Quote]
shaode01 2012-07-20
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* const argv[]) { //动态载入内存
FILE *fpt;
char line[100];
char* *str_table = NULL;
int size = 0;
int i = 0;
int j;
fpt=fopen("temp.txt","r");
if(fpt==NULL)
{
printf("error");
exit(1);
}

for ( ; fscanf(fpt,"%s",line)!=EOF; ++ i) {

str_table = realloc(str_table, (++ size) * sizeof(char*));
str_table[size - 1] = strdup(line);
}
for (j = 0 ; j< i; ++ j) {
printf("str_table[%d]:%s\n", j, str_table[j]);
free(str_table[j]);
}
free(str_table);
return 0;
}
shaode01 2012-07-20
  • 打赏
  • 举报
回复
zhuangbilivable[Quote=引用 8 楼 的回复:]

理由参考本ID的星星数。(^_^)
[/Quote]
寂寞vs爱神 2012-07-20
  • 打赏
  • 举报
回复
char[][],你懂的。
Freeze_Z 2012-07-20
  • 打赏
  • 举报
回复
对单个成员使用char [], char* .
个人的考虑是.
所有字符串使用同一长度的话, 可能因实际长度的不同造成浪费, 或者长度不够.
好处则是编程时比较简单, 不用动态申请及释放内存.
综合分析.
1.各成员数据的长度差不多, 或者说即使大的话造成的浪费可以忽略. 同时长度不够存储造成的错误可忽略.
则可以选择使用char [].
2.同上情况不满足. 则可以选择char*.
请对申请和释放内存逻辑设计清楚. 不然可能产生问题. 另外这种方式造成更多的内存申请释放次数.
3.如果各成员不要求这样的统一. 则可以混搭. char [LEN1] & char [LEN2] , char [] & char *.
反正个人是能用char [] 便不用char*.
lol321 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]
引用 9 楼 的回复:
引用 7 楼 的回复:

C/C++ code
#define MAXN 10000 //最多字符串数
#define MAXLEN 128 //每个字符串包含最多字符数127+1个字符串末尾标志'\0'
static STRs[MAXN][MAXLEN];
我问这个问题主要是考虑到内存使用问题,因为我是单片机使用。呵呵

个人经验:单片机更要少用甚至不用……
[/Quote]

为什么不能用malloc,很想知道原因
加载更多回复(1)

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧