C 将指针数组连接并添加到另一个指针数组的索引中
是否可以将指针数组连接并添加到另一个指针数组的索引中。我试图将*标记指针中的字符串放入命令指针数组的第一个索引中,以此类推C 将指针数组连接并添加到另一个指针数组的索引中,c,C,是否可以将指针数组连接并添加到另一个指针数组的索引中。我试图将*标记指针中的字符串放入命令指针数组的第一个索引中,以此类推 cmd = strtok(str, " "); while(n < 5 && (act_token = strtok(NULL, " "))) { token[n] = act_token; n++;
cmd = strtok(str, " ");
while(n < 5 && (act_token = strtok(NULL, " ")))
{
token[n] = act_token;
n++;
}
token[n] = NULL;
/* Below is where I'm trying to add all the elements of the token array into one index of the comands array */
while( z < len ){
comands[b] = token[z];
z++;
}
b++;
}
cmd=strtok(str,”);
而(n<5&(act_token=strtok(NULL,“”))
{
令牌[n]=行为令牌;
n++;
}
令牌[n]=NULL;
/*下面是我试图将令牌数组的所有元素添加到comands数组的一个索引中的地方*/
while(z
我感觉到了你的痛苦。字符串处理在C中非常糟糕,而且几乎和C++一样差。
然而,一旦你写了这个函数,你所要做的就是调用它
char *GetStringFromStringArray(const char**sourceStrings, size_t nCount)
{
char *destString = NULL;
size_t destLength = 1; //start with room for null-terminator
if (nCount == 0)
return destString;
for (size_t i = 0; i < nCount; i++)
destLength += strlen(sourceStrings[i]);
destString = (char*)malloc(destLength);
strcpy(destString, sourceStrings[0]);
for (size_t i = 1; i < nCount; i++)
strcat(destString, sourceStrings[i]);
return destString;
}
int main()
{
char *tokens[10] = { "bob", "jim", "hank" };
char *destStrings[2];
destStrings[0] = GetStringFromStringArray((const char**)tokens, 2);
destStrings[1] = GetStringFromStringArray((const char**)&tokens[1], 2);
free(destStrings[0]);
free(destStrings[1]);
}
char*GetStringFromStringArray(常量字符**源字符串,大小\u t计数)
{
char*destString=NULL;
size\u t destLength=1;//从空终止符的空间开始
如果(nCount==0)
返回字符串;
对于(大小i=0;i
顺便说一句,我初始化令牌的方式不正常。纯粹是为了简单的例子。避免循环连接的O(n*n)复杂度,否则良好的答案,考虑复制到累积目的地的结束。
char *concat_alloc(const char *token[], size_t n) {
size_t sum = 1;
for (size_t i = 0; i < n; i++) {
size_t len = strlen(token[i]);
sum += len;
if (sum < len) {
return NULL; // Too long
}
}
char *dest = malloc(sum);
if (dest) {
char *p = dest;
for (size_t i = 0; i < n; i++) {
size_t len = strlen(token[i]);
memcpy(p, token[i], len);
p += len; // advance to the end
}
*p = '\0';
}
return dest;
}
char*concat\u alloc(常量char*token[],大小\u t n){
大小总和=1;
对于(大小i=0;i
我对你的目标有点困惑。如果要有两个字符串,比如“JIM”和“BOB”,然后有另一个字符串,即“JIMBOB”,而不复制数据,那么你不能……嗯,至少不能不创建自己的字符串结构/函数。出了什么问题?什么不起作用?我可以看到未定义的行为。如果循环结束是因为n>=5
那么token[n]=NULL代码>是UB。还有int len=sizeof(令牌)/sizeof(令牌[0])
不会给出令牌的数量(你在n
中已经有了,不是吗?@zzxyz我的目标是获取令牌[0]=“BOB”,令牌[1]=“John”,然后将其添加到comands指针中作为comand[0]=“BOB John”@John3136是的,我运行后意识到len不会给出令牌的数量。我已经有了N。我的代码一直工作到第二个while循环,在这个循环中我实现了类似这样的东西,例如令牌[0]=“BOB”,令牌[1]=“John”,然后添加到comands指针中作为comand[0]=“BOB”JOHN@pennyBoy-command[0]=malloc(strlen(token[0])+strlen(token[1])+1);strcpy(command[0],token[0]);strcat(command[0],token[1] );
您可能应该为任意数量的令牌编写一个函数,但这是基本过程..谢谢。我会尝试一下,因为您肯定有一点(我应该使用大小\u t
).尽管我会说,特别是考虑到OP对指针和字符串的舒适度,这可能是一种过早优化的情况。“过早优化”在试图使代码线性加速以使O()保持不变时很容易应用。这个答案不同。这需要学习者足够好的O(n*n)方法并将其带到O(n)。诚然,这可能超出了OP今天的范围,但不是过早的优化。是的,这很困难。我非常不喜欢在标准例程足够时不使用它们(这里是strcat),但我的回答会非常慢(非常慢)大量的字符串集合。我当然会用你的答案来表示字符串库,可能是我的答案来表示局部函数(处理已知数量)