• 全部
  • 问答

c char**与 char[][]的互相赋值??

打码的阿通 自宅警备部 码农  2010-02-24 10:36:34
目前小弟正在学习linux系统编程的东西。
目前遇到一个比较头疼的问题,查阅了网络上的资料都不满意,希望有高手能帮忙回答一下!
问题是这样的,如何让char**赋值给char [][]以及如何让char[][]赋值给char**


小弟想写两个函数和linux系统命令相似的函数,分别是changemod和copy(分别对应linux的 chmod和cp)
但现在遇到一个麻烦事,我想用int getCmd(char **argu)这个函数来读取用户输入的信息,int用于返回成功或者失败
而这个char **argu则用来传递一个二维字符串指针,并在程序执行正确后返回读入的信息

例如, 我在cmd下输入了cp ./huv ./hxx/hc.f
那么在这个函数里应该获得如下执行效果
argu[0] == "cp"
argu[1] == "./huv"
argu[2] == "./hxx/hc.f"
argu[3] == NULL

在这个函数里我用了char argv[4][128]用于保存用户输入的信息
使用了scanf("%s %s %s", argv[0], argv[1], argv[2]);

但当最后如何把读取的内容返回给argu却出了问题
下面附上简单的版本,希望各位高手能给点解答

#define type_prompt() (printf("user_type# "))
int getCmd(char **argu)
{
type_prompt();
char argv[4][128];
scanf("%s %s %s", argv[0], argv[1], argv[2]);
*argv[3] = NULL;

/*剩下的就是如何把argv里面的内容赋值给argu了,各位看看如何做??*/
...
}
...全文
494 点赞 收藏 18
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lxsll1 2012-11-09
泪奔,终于找到这个问题的解决方法了,动态分配内存再释放
回复
xingjidazhan 2010-02-25
引用 11 楼 stardust20 的回复:
C/C++ code#include<stdlib.h>
#include<stdio.h>
#include<cctype>
#include<string.h>#define type_prompt() (printf("user_type# "))int max(int x,int y,int z)
{int eva= (x+y+z)/3;if(x< eva)
{if(y< z)return z;elsereturn y;
}elseif(y< eva)
{if(x< z)return z;elsereturn x;
}else
{if(x< y)return y;elsereturn x;
}
}int _scanfv(char**&argv)//这边要改成二维指针的引用{
type_prompt();char argu[4][128];*argu[3]= NULL;

scanf("%s %s %s", argu[0], argu[1], argu[2]);int kk= max(strlen(argu[0]),strlen(argu[1]), strlen(argu[2]));

argv= (char**)malloc(4*sizeof(char*));for(int i=0; i<4; i++)//这边i < 4 argv[i]= (char*)malloc(kk*sizeof(char*));if(argv!= NULL)
{
strcpy(argv[0], argu[0]);
strcpy(argv[1], argu[1]);
strcpy(argv[2], argu[2]);return1;
}else
{return-1;
}return-1;
}int main(void)
{char**argv= NULL;if(_scanfv(argv))//CXX0030: Error: expression cannot be evaluated printf("%s %s %s",argv[0], argv[1], argv[2]);else printf("f");
delete argv;return0;
system("pause");
}

呵呵,正解,看来自己有待提高啊…
回复
stardust20 2010-02-25
对了要记得free掉申请的内存。。你这边用delete argv; 是错的。。
malloc和free对应
new和delete对应
还有你释放的方法也有点错了。。。二维指针要像申请时逆着释放。。。上面的代码这些也忘记改了。。楼主注意下。。
回复
xingjidazhan 2010-02-25
引用 7 楼 poisonchry 的回复:
我试着写了一段动态分配的代码~但是在主程序里面出了错误。一时间没想明白。。。。能帮我解决这个我也给分
#include <stdlib.h>
#include <stdio.h>
#include <cctype>
#include <string.h>

#define type_prompt() (printf("user_type# "))

int max(int x, int y, int z)
{
int eva = (x+y+z) / 3;

if(x < eva)
{
if(y < z) return z;
else return y;
}
else if(y < eva)
{
if(x < z) return z;
else return x;
}
else
{
if(x < y) return y;
else return x;
}
}

int _scanfv(char **argv)
{
type_prompt();
char argu[4][128];
*argu[3] = NULL;

scanf("%s %s %s", argu[0], argu[1], argu[2]);
int kk = max(strlen(argu[0]),strlen(argu[1]), strlen(argu[2]));

argv = (char**)malloc(4 * sizeof(char*));
for(int i=0; i < kk; i++)
argv[i] = (char*)malloc(kk*sizeof(char*));

if(argv != NULL)
{
strcpy(argv[0], argu[0]);
strcpy(argv[1], argu[1]);
strcpy(argv[2], argu[2]);
return 1;
}
else
{
return -1;
}
return -1;
}

int main(void)
{
char **argv = NULL;
if(_scanfv(argv)) //CXX0030: Error: expression cannot be evaluated
printf("%s %s %s",argv[0], argv[1], argv[2]);
else printf("f");
delete argv;
return 0;
system("pause");
}


printf("%s %s %s",argv[0], argv[1], argv[2]);这句出现问题了……
回复
stardust20 2010-02-25
#include <stdlib.h> 
#include <stdio.h>
#include <cctype>
#include <string.h>

#define type_prompt() (printf("user_type# "))

int max(int x, int y, int z)
{
int eva = (x+y+z) / 3;

if(x < eva)
{
if(y < z) return z;
else return y;
}
else if(y < eva)
{
if(x < z) return z;
else return x;
}
else
{
if(x < y) return y;
else return x;
}
}

int _scanfv(char **&argv) //这边要改成二维指针的引用
{
type_prompt();
char argu[4][128];
*argu[3] = NULL;

scanf("%s %s %s", argu[0], argu[1], argu[2]);
int kk = max(strlen(argu[0]),strlen(argu[1]), strlen(argu[2]));

argv = (char**)malloc(4 * sizeof(char*));
for(int i=0; i < 4; i++)//这边i < 4
argv[i] = (char*)malloc(kk*sizeof(char*));

if(argv != NULL)
{
strcpy(argv[0], argu[0]);
strcpy(argv[1], argu[1]);
strcpy(argv[2], argu[2]);
return 1;
}
else
{
return -1;
}
return -1;
}

int main(void)
{
char **argv = NULL;
if(_scanfv(argv)) //CXX0030: Error: expression cannot be evaluated
printf("%s %s %s",argv[0], argv[1], argv[2]);
else printf("f");
delete argv;
return 0;
system("pause");
}
回复
赵4老师 2010-02-25
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。

Linux下用gdb也可以查看每句C对应的汇编

想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
回复
lzh3ng 2010-02-25
每天回帖即可获得10分可用分!
回复
打码的阿通 2010-02-25
太感谢各位达人了~小弟简直泪奔啊,先试一试各位的建议,要是通过后就给分咯~^^
回复
xingjidazhan 2010-02-24
引用 6 楼 xingjidazhan 的回复:
作为参数,char **argu 和 char (*argv)[]是一致的
可以定义一个指针数组,数组元素存字符串的首地址就行了

不好意思,说错了,应该是char **argu 应该和 char * argv[]是相容的
回复
xingjidazhan 2010-02-24
引用 8 楼 poisonchry 的回复:
引用 6 楼 xingjidazhan 的回复:
作为参数,char **argu 和 char (*argv)[]是一致的
可以定义一个指针数组,数组元素存字符串的首地址就行了

那这样的话,应该怎么写呢?
假如定义了一个
void func1(char **p){
char *testing[60];//假如定义之初就已经被赋值了
/*那么现在是用p = testing;么?但我试过这种方法不行哦*/
}

应该没问题的啊!
回复
打码的阿通 2010-02-24
引用 6 楼 xingjidazhan 的回复:
作为参数,char **argu 和 char (*argv)[]是一致的
可以定义一个指针数组,数组元素存字符串的首地址就行了


那这样的话,应该怎么写呢?
假如定义了一个
void func1(char **p){
char *testing[60];//假如定义之初就已经被赋值了
/*那么现在是用p = testing;么?但我试过这种方法不行哦*/
}
回复
打码的阿通 2010-02-24
我试着写了一段动态分配的代码~但是在主程序里面出了错误。一时间没想明白。。。。能帮我解决这个我也给分
#include <stdlib.h>
#include <stdio.h>
#include <cctype>
#include <string.h>

#define type_prompt() (printf("user_type# "))

int max(int x, int y, int z)
{
int eva = (x+y+z) / 3;

if(x < eva)
{
if(y < z) return z;
else return y;
}
else if(y < eva)
{
if(x < z) return z;
else return x;
}
else
{
if(x < y) return y;
else return x;
}
}

int _scanfv(char **argv)
{
type_prompt();
char argu[4][128];
*argu[3] = NULL;

scanf("%s %s %s", argu[0], argu[1], argu[2]);
int kk = max(strlen(argu[0]),strlen(argu[1]), strlen(argu[2]));

argv = (char**)malloc(4 * sizeof(char*));
for(int i=0; i < kk; i++)
argv[i] = (char*)malloc(kk*sizeof(char*));

if(argv != NULL)
{
strcpy(argv[0], argu[0]);
strcpy(argv[1], argu[1]);
strcpy(argv[2], argu[2]);
return 1;
}
else
{
return -1;
}
return -1;
}

int main(void)
{
char **argv = NULL;
if(_scanfv(argv)) //CXX0030: Error: expression cannot be evaluated
printf("%s %s %s",argv[0], argv[1], argv[2]);
else printf("f");
delete argv;
return 0;
system("pause");
}
回复
xingjidazhan 2010-02-24
作为参数,char **argu 和 char (*argv)[]是一致的
可以定义一个指针数组,数组元素存字符串的首地址就行了
回复
打码的阿通 2010-02-24
引用 4 楼 mostmark 的回复:
argu=(char **)argv;
这个可以么?总感觉很悬。。。

我也这么觉得呢~函数调用结束后,里面的东西就很麻烦了哦
回复
mostmark 2010-02-24
argu=(char **)argv;
这个可以么?总感觉很悬。。。
回复
stardust20 2010-02-24
动态分配内存。。再释放。。
回复
打码的阿通 2010-02-24
引用 1 楼 stardust20 的回复:
就是如何把argv里面的内容赋值给argu了,各位看看如何做
可以用强制转化
argu=(char **)argv;
不过就算这样赋值了char argv[4][128];是局部变量。。它的内存,函数结束后就会释放
你把它的地址传出去了。。。还是用不了。。。


确实是的,函数的生命期一结束,里面的内容就很难有所保证了
确实另人头疼~对了,我曾经想用strcpy这个函数,
但却因为一个是char**和char*这两个类型无法赋值。不过直觉上好像或许有什么方法可以让它能成~?!
回复
stardust20 2010-02-24
就是如何把argv里面的内容赋值给argu了,各位看看如何做
可以用强制转化
argu=(char **)argv;
不过就算这样赋值了char argv[4][128];是局部变量。。它的内存,函数结束后就会释放
你把它的地址传出去了。。。还是用不了。。。
回复
发帖
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2010-02-24 10:36
社区公告
暂无公告