使用 strtok_s 从 char* 文本创建动态 char* 数组
Creating a dynamic array of char* from a char* text using strtok_s
我在这里的搜索得到了很多结果,但是 none 很像,这样我就可以找到解决问题的方法。
我正在使用 Visual Studio 2013 在 C 中创建一个 Mathcad UserEFI DLL。我不想使用字符串,只使用 char*。
现在,我想模拟控制台主函数,它使用 char* argv[] 来访问调用的可执行文件的参数。 Mathcad 将使用类似“-T=3 z h 13”的字符串调用 DLL。我想要的只是将此文本解析为一个 char* 数组,就像 argv[] 如果我用这个添加的参数调用可执行文件一样。我希望我以一种可以理解的方式表达了这一点。
我使用 strtok_s 来解析文本并且必须考虑,每个标记都可以有不同的大小。
错误一定出在以下函数中:
typedef struct tArgReturnType {
int ACount;
char** Argus;
} ARGRETURN;
ARGRETURN ParseStringToArgs(char* text) {
char *token = NULL;
char *nextToken = NULL;
int argCount = 0;
char* temptext = NULL;
strcpy(temptext, text);
char** uebergabe = (char**)malloc(sizeof(char**));
token = strtok_s(temptext, " ", &nextToken);
while (token != NULL) {
argCount++;
uebergabe = (char**)realloc(uebergabe, sizeof(uebergabe)+sizeof(token));
uebergabe[argCount - 1] = token;
token = strtok_s(NULL, " ", &nextToken);
}
ARGRETURN ReturnVar;
ReturnVar.ACount = argCount;
ReturnVar.Argus = (char**)malloc(sizeof(uebergabe));
memcpy(ReturnVar.Argus, uebergabe, sizeof(uebergabe));
free(uebergabe);
return ReturnVar;
}
我确定这是一堆堆内存分配失败的大杂烩(如 mathcad 编译器给我的错误所示),因为我在尝试找到解决方案时多次修改了这段代码。我现在完全糊涂了。
更新代码:
typedef struct tArgReturnType {
int ACount;
char** Argus;
} ARGRETURN;
ARGRETURN ParseStringToArgs(char* text) {
char *token = NULL;
char *nextToken = NULL;
int argCount = 0;
char* temptext = malloc(strlen(text) + 1);
strcpy(temptext, text);
char** uebergabe = malloc(sizeof(char**));
token = strtok_s(temptext, " ", &nextToken);
while (token != NULL) {
argCount++;
uebergabe = (char**)realloc(uebergabe, sizeof(uebergabe)+sizeof(token));
uebergabe[argCount - 1] = token;
token = strtok_s(NULL, " ", &nextToken);
}
ARGRETURN ReturnVar;
ReturnVar.ACount = argCount;
ReturnVar.Argus = malloc(sizeof(uebergabe));
memcpy(ReturnVar.Argus, uebergabe, sizeof(uebergabe));
free(uebergabe);
free(temptext);
return ReturnVar;
}
ARGRETURN ParseStringToArgs(const char* text) {
ARGRETURN ReturnVar = { 0 };
int n = 0;
char temp[100];
while (sscanf(text += n, "%99s%n", temp, &n) == 1) {
ReturnVar.Argus = realloc(ReturnVar.Argus, ++ReturnVar.ACount*sizeof(*ReturnVar.Argus));
strcpy(ReturnVar.Argus[ReturnVar.ACount - 1] = malloc(strlen(temp) + 1), temp);
}
return ReturnVar;
}
- 'sizeof(text)' 大错特错
- 不要使用丑陋的 strtok(_s),它不可重入,会破坏字符串,...
- 改用 sscanf
我在这里的搜索得到了很多结果,但是 none 很像,这样我就可以找到解决问题的方法。
我正在使用 Visual Studio 2013 在 C 中创建一个 Mathcad UserEFI DLL。我不想使用字符串,只使用 char*。
现在,我想模拟控制台主函数,它使用 char* argv[] 来访问调用的可执行文件的参数。 Mathcad 将使用类似“-T=3 z h 13”的字符串调用 DLL。我想要的只是将此文本解析为一个 char* 数组,就像 argv[] 如果我用这个添加的参数调用可执行文件一样。我希望我以一种可以理解的方式表达了这一点。 我使用 strtok_s 来解析文本并且必须考虑,每个标记都可以有不同的大小。
错误一定出在以下函数中:
typedef struct tArgReturnType {
int ACount;
char** Argus;
} ARGRETURN;
ARGRETURN ParseStringToArgs(char* text) {
char *token = NULL;
char *nextToken = NULL;
int argCount = 0;
char* temptext = NULL;
strcpy(temptext, text);
char** uebergabe = (char**)malloc(sizeof(char**));
token = strtok_s(temptext, " ", &nextToken);
while (token != NULL) {
argCount++;
uebergabe = (char**)realloc(uebergabe, sizeof(uebergabe)+sizeof(token));
uebergabe[argCount - 1] = token;
token = strtok_s(NULL, " ", &nextToken);
}
ARGRETURN ReturnVar;
ReturnVar.ACount = argCount;
ReturnVar.Argus = (char**)malloc(sizeof(uebergabe));
memcpy(ReturnVar.Argus, uebergabe, sizeof(uebergabe));
free(uebergabe);
return ReturnVar;
}
我确定这是一堆堆内存分配失败的大杂烩(如 mathcad 编译器给我的错误所示),因为我在尝试找到解决方案时多次修改了这段代码。我现在完全糊涂了。
更新代码:
typedef struct tArgReturnType {
int ACount;
char** Argus;
} ARGRETURN;
ARGRETURN ParseStringToArgs(char* text) {
char *token = NULL;
char *nextToken = NULL;
int argCount = 0;
char* temptext = malloc(strlen(text) + 1);
strcpy(temptext, text);
char** uebergabe = malloc(sizeof(char**));
token = strtok_s(temptext, " ", &nextToken);
while (token != NULL) {
argCount++;
uebergabe = (char**)realloc(uebergabe, sizeof(uebergabe)+sizeof(token));
uebergabe[argCount - 1] = token;
token = strtok_s(NULL, " ", &nextToken);
}
ARGRETURN ReturnVar;
ReturnVar.ACount = argCount;
ReturnVar.Argus = malloc(sizeof(uebergabe));
memcpy(ReturnVar.Argus, uebergabe, sizeof(uebergabe));
free(uebergabe);
free(temptext);
return ReturnVar;
}
ARGRETURN ParseStringToArgs(const char* text) {
ARGRETURN ReturnVar = { 0 };
int n = 0;
char temp[100];
while (sscanf(text += n, "%99s%n", temp, &n) == 1) {
ReturnVar.Argus = realloc(ReturnVar.Argus, ++ReturnVar.ACount*sizeof(*ReturnVar.Argus));
strcpy(ReturnVar.Argus[ReturnVar.ACount - 1] = malloc(strlen(temp) + 1), temp);
}
return ReturnVar;
}
- 'sizeof(text)' 大错特错
- 不要使用丑陋的 strtok(_s),它不可重入,会破坏字符串,...
- 改用 sscanf