字符串拆分后C char **到char []

时间:2016-09-23 17:19:43

标签: c arrays string char

我正在尝试将输入参数的字符串拆分为','后存储到char []数组中。现在这是我的代码:

int main(int argc, char* argv[])
{
 char *function= NULL;
 //The function is a parameter in the format function_name,par1,par2..
 function=argv[4];
 char** tokens;
 tokens = str_split(function, ',');

 if (tokens)
{
 int i;
 char *function_name;
 char arguments[10];

 for (i = 0; *(tokens + i); i++)
 {
    printf("function=[%s]\n",*(tokens + i));
    if(i==0)
    {
        function_name=*(tokens + i);
        printf("function_name: %s\n",function_name);
    }
    else
    {
       arguments[i-1]=*(tokens + i);
    }
    free(*(tokens + i));
  }

  if(strcmp("PKCS7SignML",function_name))
 {
  const char *pin_number=arguments[0];
  printf("pin: %s\n",pin);
  unsigned long slot_number=atol(arguments[1]);
  printf("slot_number: %lu\n",slot_number);
  const char *szInputFileName=arguments[2];
  printf("szInputFileName: %c\n",szInputFileName);
  const char *szOutputFileName=arguments[3]);
  printf("szOutputFileName: %c\n",szOutputFileName);
  int bInitialize=atoi(arguments[4]);
  printf("bInitialize: %d\n",bInitialize);
 }

但是当我尝试打印char值时,值为空。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:1)

您要将类型char *的值分配给类型为char的数组元素。稍后你会将那些相同的数组元素视为每个整数char数组或指向它们的指针。因此,我最好的猜测是,您希望以不同方式声明arguments

// An array of 10 pointers to char:
char *arguments[10];

此外,在将tokens的每个元素分配给变量或数组成员后,您释放该指针。您需要了解释放指针是指向指针的及其指向的内存,而不是关于存储指针值的变量(如果有) 。释放这些指针会使它们的所有副本无效,包括刚刚完成分配的那些副本。这显然不是你真正想要的,因为你以后会尝试取消引用这些指针。

答案 1 :(得分:0)

我无法编译你的代码,但这里有一个明显的错误:

 char arguments[10];

然后你做:

       arguments[i-1]=*(tokens + i);

您正在编写指向char的指针。

编辑:我已经编译了你的代码,有几个错误。例如,你过早地释放指针。

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

char** str_split(char* a_str, const char a_delim)
{
char** result    = 0;
size_t count     = 0;
char* tmp        = a_str;
char* last_comma = 0;
char delim[2];

    delim[0] = a_delim;
    delim[1] = 0;

    while (*tmp)
    {
        if (a_delim == *tmp)
        {
            count++;
            last_comma = tmp;
        }
        tmp++;
    }

    /* Add space for trailing token. */
    count += last_comma < (a_str + strlen(a_str) - 1);

    /* Add space for terminating null string so caller
    knows where the list of returned strings ends. */
    count++;


    result = malloc(sizeof(char*) * count);

    if (result)
    {
        size_t idx  = 0;
        char* token = strtok(a_str, delim);

        while (token)
        {
            assert(idx < count);
            *(result + idx++) = strdup(token);
            token = strtok(0, delim);
        }
        assert(idx == count - 1);
        *(result + idx) = 0;
    }

    return result;
}

int main(int argc, char* argv[])
{
 int i;
 char *function= NULL;
     //The function is a parameter in the format function_name,par1,par2..
     function=argv[4];
     char** tokens;
     tokens = str_split(function, ',');

    if (tokens)
    {
    char *function_name;
    char *arguments[10];

        for (i = 0; *(tokens + i); i++)
        {
            printf("function=[%s]\n",*(tokens + i));
            if (i==0)
            {
                function_name=*(tokens + i);
                printf("function_name: %s\n",function_name);
            }
            else
            {
                arguments[i-1]=*(tokens + i);
            }
        }

        if (strcmp("PKCS7SignML",function_name))
        {
        const char *pin_number=arguments[0];
        unsigned long slot_number=atol(arguments[1]);
        const char *szInputFileName=arguments[2];
        const char *szOutputFileName=arguments[3];
        int bInitialize=atoi(arguments[4]);

            printf("pin: %s\n",pin_number);
            printf("slot_number: %lu\n",slot_number);
            printf("szInputFileName: %s\n",szInputFileName);
            printf("szOutputFileName: %s\n",szOutputFileName);
            printf("bInitialize: %d\n",bInitialize);
        }
    }
    i =0;
    while (tokens[i]) {
        free(tokens[i++]);
    }
    return 0;
}

答案 2 :(得分:0)

这是我的str_split函数:

char** str_split(char* a_str, const char a_delim)
{
 char** result    = 0;
 size_t count     = 0;
 char* tmp        = a_str;
 char* last_comma = 0;
 char delim[2];
 delim[0] = a_delim;
 delim[1] = 0;

 while (*tmp)
 {
    if (a_delim == *tmp)
    {
        count++;
        last_comma = tmp;
    }
    tmp++;
 }

/* Add space for trailing token. */
count += last_comma < (a_str + strlen(a_str) - 1);

/* Add space for terminating null string so caller
   knows where the list of returned strings ends. */
count++;

result = malloc(sizeof(char*) * count);

if (result)
{
    size_t idx  = 0;
    char* token = strtok(a_str, delim);

    while (token)
    {
        assert(idx < count);
        *(result + idx++) = strdup(token);
        token = strtok(0, delim);
    }
    assert(idx == count - 1);
    *(result + idx) = 0;
}

 return result;
}

现在我更正了char参数的声明[10];成:

char *arguments[10];

并删除了'免费(令牌);'语句行,但是当我运行代码时,它不会进入

if(strcmp("PKCS7SignML",function_name))

答案 3 :(得分:0)

根据多米尼克的建议,我解决了这个问题。

两个重要的错误是:

1。free(*(tokens + i));
   在读取参数[i]中的值之前调用。因此,当我尝试访问指向的char源时,它的值为null。

2。if(strcmp("PKCS7SignML",function_name)==0) 如果str1等于str2 strcmp() function

,则strcmp函数返回0