我正在尝试将输入参数的字符串拆分为','后存储到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值时,值为空。
我该如何解决这个问题?
答案 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