函数参数是多位数组的问题

nsqsmile 2003-12-01 09:33:22
char 的多位数组如何用指针实现函数参数的传递?(主要是想实现用指针传递字符串)
例如:
char abc[2][] = {"fdsfds","fasdfsa"};
如何传递abc?

再一个将一个字符串拆分成多个字符串时,保存在字符串数组中时,数组如何声明?(既无法初始化)
...全文
90 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
huoniao1976 2003-12-02
  • 打赏
  • 举报
回复
如果要传递字符二维数组,数组最好是char * name[] = {...}
huoniao1976 2003-12-02
  • 打赏
  • 举报
回复
char a()
{
char array[][]...
b(&array);
}
char b(*pb)
{...
}
nsqsmile 2003-12-02
  • 打赏
  • 举报
回复
二维数组char aa[][]能不能作为函数参数为char**的函数的参数?
即:函数int small(char** p);
能不能这样调用small(a)?
如果不能,用指针如何传递二位数组?

  • 打赏
  • 举报
回复
//以下为数组
char a[3]; //一维字符数组
char b[5][3]; //二维字符数组
char *c[9]; //一维指针数组

//以下是指针
char **d; //字符指针的指针,可以是指向针数组
char (*e)[3]; //数组指针, 指向 char[3] 型数组的指针
char (*f)[5][3]; //数组指针, 指向 char[5][3] 型数组的指针

void Func1(char (*p)[3]) //p为传入的参数
{
}

void Func2(char (*p)[5][3]) //p为传出的参数
{
}

以下调用合法:
Func1(b);
Func2(&b);

以下赋值合法:
d = c;
e = &a;
e = b;
f = &b;
natasha 2003-12-01
  • 打赏
  • 举报
回复
不妨考虑用vector。
  • 打赏
  • 举报
回复
标准C的解决方法:

void divstr(char *src, char ***ppps, int *n)
{
int Ln = strlen(src);
*n=0;
if(Ln>0)
{
*n=1;
char *lpc, *lps=src;
while((lps=strchr(lps,'\t'))!=NULL)
{
lps++;
(*n)++;
}

lps=src;
(*ppps)=new char*[*n];
int x, i=0;
while((lpc=strchr(lps,'\t'))!=NULL)
{
int x = lpc-lps;
(*ppps)[i]=new char[x+1];
strncpy((*ppps)[i],lps,x);
(*ppps)[i][x]=0;
lps=lpc+1;
i++;
}
if(i<*n)
{
int x = Ln-(lps-src);
(*ppps)[i]=new char[x+1];
strncpy((*ppps)[i],lps,x);
(*ppps)[i][x]=0;
}
}
}

void delstr(char ***ppps, int n)
{
for(int i=0; i<n; i++)
delete[](*ppps)[i];
delete[](*ppps);
*ppps=NULL;
}

void main(void)
{
char s[]="abc\tdef\t1234567890\tqwerty"; //由 \t 分割的字符串
char **a;
int n;

divstr(s, &a, &n); //分解字符串到一个字符串数组

for(int i=0; i<n; i++)
printf("%s\n",a[i]); //访问分解之后的各个字符串

delstr(&a,n); //释放字符串数组的内存
}
nsqsmile 2003-12-01
  • 打赏
  • 举报
回复
刚才没描述清楚,对不起!

有一个分割字符串的函数divstr(char* instr,??),其功能是按算法将instr分割成n个字符串,用指针还是数组来保存?
如果用数组的话,牵扯到变长的问题,可能要浪费一些内存。
在标准c下如何解决?
jiangchun_xn 2003-12-01
  • 打赏
  • 举报
回复
使用指针数组要好些。

char *p[2];
natasha 2003-12-01
  • 打赏
  • 举报
回复
第二个问题,可以用TStringList
  • 打赏
  • 举报
回复
char aaa[2][10]={"123","35346" };
char bbb[2][10]={"abc","defhgga"};
char ccc[2][10]={"xdy","gjayaf" };

char (*lpArr[3])[2][10] = {&aaa,&bbb,&ccc};

Edit1->Text = (*lpArr[0])[0];
Edit2->Text = (*lpArr[0])[1];
Edit3->Text = (*lpArr[1])[0];
Edit4->Text = (*lpArr[1])[1];
  • 打赏
  • 举报
回复
不好意思,上个程序错了,应该这样

char abc[2][10]={"123","35346"};

void TForm1::MyFunc(char (*lpa)[2][10])
{
Edit1->Text = (*lpa)[0];
Edit2->Text = (*lpa)[1];
}

void TForm1::MyFunc1(char (*lpa)[10])
{
Edit1->Text = lpa[0];
Edit2->Text = lpa[1];
}

void __fastcall TForm1::Button3Click(TObject *Sender)
{
MyFunc(&abc);
MyFunc1(abc);
}
  • 打赏
  • 举报
回复
char abc[2][10]={"fdsfds","fasdfsa"};

void TForm1::MyFunc(char (*lpa)[2][10])
{
Edit1->Text = abc[0];
Edit2->Text = abc[1];
}

void __fastcall TForm1::Button3Click(TObject *Sender)
{
MyFunc(&abc);
}

这句话没看懂『再一个将一个字符串拆分成多个字符串时,保存在字符串数组中时,数组如何声明?(既无法初始化)』
  • 打赏
  • 举报
回复
char *s; //字符串 (字符指针), 用 s = new char [n]; 分配内存

char **ps; //指向字符串的指针,字符指针的指针
ps = new char *[x]; //ps = 分配 x 个 char* 指针的指针数组
这个数组的内容是 x 个指针,注意只是指针,如果要用这些(x个)指针,
每个都需要分配内存,或者等于已知的地址

ps[0] 就是第 0 个字符指针,即 char * 指针, 相当于最上面说的 s
ps[0] = new char[n]; //为 char * 指针分配 n 个字节的内存, 与 s = new char[n] 相同
ps[1] = new ...
ps[... 一共 x 个指针] = new ...

如果不分配内存,这样写也是正确的:
ps[i] = "asdfasgsdfg"; //等于一个静态的字符串
因为 ps[i] 是字符指针。

由于函数是向外传值的参数,所以定义成指向 char **ps 的指针,就变成 char ***ppps 了
其中 (*ppps) 就是上面说的 char **ps 的 ps, 这样定义只是为了把 ps 地址传到函数外
nsqsmile 2003-12-01
  • 打赏
  • 举报
回复
to ybchen() :能不能解释你的代码?没看懂,谢谢!

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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