指向char[]的双指针

指向char[]的双指针,c,pointers,casting,C,Pointers,Casting,好的,我有以下代码: char** args = (char**)malloc(10*sizeof(char*)); memset(args, 0, sizeof(char*)*10); char* curToken = strtok(string, ";"); for (int z = 0; curToken != NULL; z++) { args[z] = strdup(curToken); curToken = strtok(NULL, ";") } 我希望每个ar

好的,我有以下代码:

char** args = (char**)malloc(10*sizeof(char*));
memset(args, 0, sizeof(char*)*10);

char* curToken = strtok(string, ";");

for (int z = 0; curToken != NULL; z++) {
    args[z] = strdup(curToken);
    curToken = strtok(NULL, ";")
}
我希望每个
arg[z]
都被转换成一个字符数组——字符字符串[100]——然后用下面的算法进行处理。每一个
arg[z]
都需要在某个点上转换为变量字符串。我被指针弄糊涂了,但我正在慢慢地变得更好

编辑:

arg[0]
将是ls,
arg[1]
将是日期,
arg[2]
将是上述代码之后的ls


我想把每个参数放回char字符串[100],并通过算法处理它

如果希望将字符串的部分复制到固定长度的字符串[100],则需要为循环中的每个args[]malloc 100个字符,并将strtok的结果strncpy()复制到其中。strdup将只为所提供字符串的实际长度分配足够的内存(加上\0)

此:

char** args = (char**)malloc(10*sizeof(char*));
memset(args, 0, sizeof(char*)*10);

是坏代码。首先,您不应该强制转换
malloc()
的返回值。其次,
args
是指向
char
的十个指针的指针。不能使用
memset()
将它们设置为
NULL
,不能保证“所有字节零”与
NULL
相同。您需要使用循环。

一个最简单的方法是在某个临时变量中保留原始字符串的备份

char string[100] = "ls ; date ; ls"; 
char temp_str[100] = {0};
strcpy (temp_str, string);
另一种方法是通过
strcat
实现
z
具有耕地数量

memset(string, '\0', 100);
for (i = 0; i < z; i++)
{
    strcat(string, args[i]);
    if (i != (z - 1))
    {
        //if it is last string dont append semicolon
        strcat(string, ";");
    }
}
memset(字符串'\0',100);
对于(i=0;i

注意:注意边界条件检查

(旁白)
memset
与指针不可靠;不能保证空指针都是零。(在普通硬件上是这样,但是通过
args
将每个元素设置为
NULL
的循环更方便、更明确。)如果超过
10个
令牌怎么办
args
仅适用于
10
。不需要对malloc进行强制转换。另外,你的实际问题是什么?不确定问题是什么,代码看起来很好,除了没有索引控制<代码> ARGs<代码>。如果你想清除你的Malc内存,考虑CalLoCo()。另外,我也不太确定你在问什么……我想我知道你想做什么,但这会比你想要的更深入一些。如果我错了,请纠正我,但您正在尝试将存储在
arg
中的所有字符串连接到一个字符串中。C本机不提供这样做的方法。强制转换指针将不会像您期望的那样,因为一旦所有的事情都说了和做了,它就包含指针而不是字符。你能用一个例子更新吗,包括一个输入字符串和你期望的输出?我不太确定你想要什么样的。
memset(string, '\0', 100);
for (i = 0; i < z; i++)
{
    strcat(string, args[i]);
    if (i != (z - 1))
    {
        //if it is last string dont append semicolon
        strcat(string, ";");
    }
}