【问题标题】:How to merge multiple array tokens into one in c如何在c中将多个数组标记合并为一个
【发布时间】:2021-04-18 19:13:45
【问题描述】:

我正在尝试将多个字符串数组标记合并为一个,例如:

char* args = { "zero" , "one', "two"}

注意 args 不是固定大小,它可以是 1 或 100

我想做一个新数组

char* array ={"one two"}

中间有空格。

我试过了:

char* array; 
int i=1;
    for(i=1; i< sizeof(args)-1 ; i++){
        strcat(array, args[i]);  
    }

但不断出现分段错误。

这是我正在使用的代码,需要添加将我的所有 args 从 1(不是零,因为 arg[0] 有一个命令)组合到任何大小的函数:

else if ( (args[1] != NULL) && (strchr(args[1], '=') != NULL) ) {
 

    memcpy(aliasCommands[aliasCount], args[1], 512 ); 

    printf("Save Alias\n");

    printf("Alias Added : %s\n", aliasCommands[aliasCount]);

    aliasCount++;

    printf("Alias Number : %d\n", aliasCount);

        }

我想传递 args[1] 空间 args[2] 等等,而不是只有 args[1]

让我们这么说

args[1]={"command='ls"}
args[2]={"cd'"}

以此类推,args 最多可达 512。我想将它们作为一个字符串传入

aliasCommand[aliasCount] = {"command='ls cd'"}

【问题讨论】:

  • 您尝试的方法将有效,除非您从未分配过char* array...
  • 分配足够的内存来保存每个token以及每个token之间的空间以及一个空终止符,然后你可以试试strcat。
  • 您的代码不包含任何字符串。如果您使用单引号,则在键入 int 时创建字符文字。如果将多个字符包含在单引号中,则会得到一个多字节字符文字,其值由实现定义。你想要的是使用双引号 " 而不是 '
  • 我更新了我的代码以使其更清晰,这对我不起作用。

标签: arrays c c-strings string-concatenation string-literals


【解决方案1】:

你有几个问题

  1. 你没有正确计算元素的数量

  2. 你没有空间来存储结果

  3. strcat 想要一个以 nul 结尾的字符串

我将使用snprintf 而不是strcat 以避免缓冲区溢出,例如:

#include <stdio.h>

int main(void)
{
    char *args[] = {"zero", "one", "two"};
    char str[32];
    size_t len = 0;

    for (size_t i = 0; i < sizeof args / sizeof *args; i++)
    {
        len += (size_t)snprintf(str + len, (sizeof str) - len, "%s ", args[i]);
    }
    // Remove the last space
    str[len - 1] = '\0';
    printf("<%s>\n", str);
    return 0;
}

输出:

<zero one two>

【讨论】:

  • 我更新了我的代码以使其更清晰,这对我不起作用。
【解决方案2】:

首先,在此声明中使用的初始化程序(您忘记放置分号的地方)

char* args[] = { 'zero' , 'one', 'two'};

不是字符串文字,而是具有实现定义值的多字节整数字符常量。

看来你的意思

char * args[] = { "zero" , "one", "two" };

还有这个数组的声明(你再次使用整数字符常量而不是字符串文字)

char* array[]={'zero one two'}

意义不大,因为它相当于

char* array[1]={'zero one two'}

看来你的意思

char *array={ "zero one two" }

您需要动态分配一个足够大的数组,并将数组args中指向的字符串字面量复制到数组array中。

这是一个演示程序。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main( void )
{
    char * args[] = { "zero" , "one", "two" };
    const size_t N = sizeof( args ) / sizeof( *args );

    size_t n = 0;
    for (size_t i = 0; i < N; i++) n += strlen( args[i] );

    char *array = malloc( n + N );

    if (array != NULL)
    {
        size_t n = 0;
        array[0] = '\0';
        for (size_t i = 0; i < N; i++)
        {
            if (i != 0)
            {
                array[n] = ' ';
                array[++n] = '\0';
            }

            strcpy( array + n, args[i] );
            n += strlen( args[i] );
        }
        puts( array );
    }

    free( array );
}

程序输出是

zero one two

【讨论】:

  • 我更新了我的代码以使其更清晰,这对我不起作用。
猜你喜欢
  • 2017-01-11
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 2021-04-20
相关资源
最近更新 更多