Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理二维C字符串时的分段错误_C_String - Fatal编程技术网

处理二维C字符串时的分段错误

处理二维C字符串时的分段错误,c,string,C,String,我试图创建一个C字符串的二维数组,这样 char *input[2]; input[0] = cat /etc/passwd input[1] = grep root 我们如何做到这一点 char **dArray; dArray[0][0] = cat dArray[0][1] = /etc/passwd dArray[0][2] = NULL // Append NULL to mark end dArray[1][0] = grep dArray[1][1] = roo

我试图创建一个C字符串的二维数组,这样

char *input[2]; 

input[0] = cat /etc/passwd
input[1] = grep root
我们如何做到这一点

char **dArray; 

dArray[0][0] = cat
dArray[0][1] = /etc/passwd
dArray[0][2] = NULL   // Append NULL to mark end


dArray[1][0] = grep 
dArray[1][1] = root
dArray[1][2] = NULL // Append NULL to mark end 
//我的代码
字符**p;
char*_p[2];
_p[0]=cat/etc/passwd
_p[1]=grep根
p=malloc(2*sizeof(char*));

对于(i=0;i由于字符串已经是一维数组,因此需要一个二维数组来存储与字符串本身无关的字符串组,并且在使用前应分配每个顶部元素

比如:

// My Code 

char **p ; 
char *_p[2];

_p[0] = cat /etc/passwd
_p[1] = grep root

p = malloc(2 * sizeof(char*));

for(i=0; i<2 ;i++){
   p[i] = malloc(20 * sizeof(char));
}

strcpy(p[0],_p[0]);
strcpy(p[0],_p[0]);

printf("%s,%s",p[0][0],p[1]); // I except the output cat,grep root 

您的问题是这一行:

char ***dArray = malloc(sizeof(char**)*2);

dArray[0] = malloc(sizeof(char*)*3);

dArray[0][0] = "cat";
dArray[0][1] = "/etc/passwd";
dArray[0][2] = NULL;

dArray[1] = malloc(sizeof(char*)*3);

dArray[1][0] = "grep";
...
p[0][0]
不是字符串/char*-您使用了%s,因此printf需要一个字符串。p[0][0]是char,是第一个数组中的第一个字符

使用
printf(“%s,%s”,p[0],p[1]);


另外,您已将字符串复制到p[0]中两次,p[1]中存在垃圾。请确保您也从_p[1]复制到p[1]。

这是一个不使用
malloc
的版本

printf("%s,%s",p[0][0],p[1]); 
#包括
const char*cmd1[]={“cat”,“/etc/passwd”,NULL};
const char*cmd2[]={“grep”,“root”,NULL};
常量字符**dArray[]={cmd1,cmd2,NULL};
内部主(空)
{ 
for(const char***cmd=dArray;*cmd;cmd++){
printf(“命令\n”);
for(常量字符**arg=cmd[0];*arg;arg++){
printf(“参数%s\n”,*arg);
}
}
返回0;
}

发布你的实际代码。这甚至都不接近编译,因为所有的反勾号都是如此。它不可能用代码中的字符来编译(即反勾号提到的字符)。我用你最初的方式编写它。我会尝试用字符***。在这之前,我认为我在指针方面做得不错。。
#include <stdio.h>

const char *cmd1[] = { "cat", "/etc/passwd", NULL };
const char *cmd2[] = { "grep", "root", NULL };
const char **dArray[] = { cmd1, cmd2, NULL };

int main(void)
{ 
  for (const char ***cmd = dArray; *cmd; cmd++) {
    printf("command\n");
    for (const char **arg = cmd[0]; *arg; arg++) {
      printf("  argument %s\n", *arg);
    }
  }
  return 0;
}