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了,各位看看如何做??*/
...
}
...全文
786 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
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 编译程序实验 实验目的:用c语言对一个简单语言的子集编制一个一遍扫描的编译程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。 语法分析 C2.1 实验目的 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析. C2.2 实验要求 利用C语言编制递归下降分析程序,并对简单语言进行语法分析. C2.2.1待分析的简单语言的语法 实验目的 通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法. 实验要求 采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。 实验的输入和输出 输入是语法分析提供的正确的单词串,输出为三地址指令形式的四元式序列。 例如:对于语句串 begin a:=2+3*4;x:=(a+b)/c end# 输出的三地址指令如下: (1) t1=3*4 (2) t2=2+t1 (3) a=t2 (4) t3=a+b (5) t4=t3/c (6) x=t4 算法思想 1设置语义过程 (1) emit(char *result,char *arg1,char *op,char *ag2) 该函数功能是生成一个三地址语句送到四元式表中。 四元式表的结构如下: struct {char result[8]; char ag1[8]; char op[8]; char ag2[8]; }quad[20]; (2)char *newtemp() 该函数回送一个新的临时变量名,临时变量名产生的顺序为T1,T2,…. Char *newtemp(void) { char *p; char m[8]; p=(char *)malloc(8); k++; itoa(k,m,10); strcpy(p+1,m); p[0]=’t’; return(p); } (2)主程序示意图如图c.10所示。 (2) 函数lrparser在原来语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。在实验中我们只对表达式、赋值语句进行翻译。 语义分析程序的C语言程序框架 int lrparser() { int schain=0; kk=0; if(syn=1) { 读下一个单词符号; schain=yucu; /调用语句串分析函数进行分析/ if(syn=6) { 读下一个单词符号; if(syn=0 && (kk==0)) 输出(“success”); } else { if(kk!=1 ) 输出 ‘缺end’ 错误;kk=1;} else{输出’begin’错误;kk=1;} } return(schain); int yucu() { int schain=0; schain=statement();/调用语句分析函数进行分析/ while(syn=26) {读下一个单词符号; schain=statement(); /调用语句分析函数进行分析/ } return(schain); } int statement() { char tt[8],eplace[8]; int schain=0; {switch(syn) {case 10: strcpy(tt,token); scanner(); if(syn=18) {读下一个单词符号; strcpy(eplace,expression()); emit(tt,eplace,””,””); schain=0; } else {输出’缺少赋值号’的错误;kk=1; } return(schain); break; } } char *expression(void) {char *tp,*ep2,*eplace,*tt; tp=(char *)malloc(12);/分配空间/ ep2=(char *)malloc(12); eplace=(char *)malloc(12); tt =(char )malloc(12); strcpy(eplace,term ());/调用term分析产生表达式计算的第一项eplace/ while(syn=13 or 14) { 操作符 tt= ‘+’或者‘—’; 读下一个单词符号; strcpy(ep2,term());/调用term分析产生表达式计算的第二项ep2/ strcpy(tp,newtemp());/调用newtemp产生临时变量tp存储计算结果/ emit(tp,eplace,tt,ep2);/生成四元式送入四元式表/ strcpy(eplace,tp); } return(eplace); } char *term(void)/仿照函数expression编写/ char *factor(void) {char *fplace; fplace=(char *)malloc(12); strcpy(fplace, “ ”); if(syn=10) {strcpy(fplace,,token);/将标识符token的值赋给fplace/ 读下一个单词符号; } else if(syn=11) {itoa(sum,fplace,10); 读下一个单词符号; } else if (syn=27) {读下一个单词符号; fplace=expression();/调用expression分析返回表达式的值/ if(syn=28) 读下一个单词符号; else{输出‘}’错误;kk=1; } } else{输出‘(’错误;kk=1; } return(fplace); }

69,336

社区成员

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

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