好的。所以我在 C 语言中有这个程序,我在其中获取一个带有参数和值的字符串(例如:“GO 45 STOP 15”)。目标是解析字符串并将参数及其对应的值放入 typedef 结构中以供以后使用。
这是我的结构的样子:
typedef struct {
char* keyword;
double value;
} parameter;
这是我遇到问题的一些代码副本。main() 和 initParams() 都在同一个文件中,因此都可以访问相同的 #defines...
主要的():
#include <stdio.h>
#include <stdlib.h>
#include "findArgs.h"
#define STR0_SIZE 80
#define LIST_SIZE 4
#define MAX_PARAMS 15
void main(){
int i;
char str0[STR0_SIZE] = "LEFT 45 GO 686 GO 34.3 STOP 56 RIGHT 26"; //Input String
char* wordList[LIST_SIZE]={"GO", "STOP", "LEFT", "RIGHT"};
int num_arg = 0; //Number of arguements in str0 (each space denotes the end of an arg)
parameter* param;
initParams(param);
replaceSpaces(str0, &num_arg);
findWords(param, str0, num_arg);
}
初始化参数:
void initParams(parameter* param){
int ctr0, ctr1;
param = (parameter*) malloc(MAX_PARAMS * sizeof(parameter));
printf("\n%i\n", sizeof(parameter));
for(ctr0=0;ctr0<MAX_PARAMS;ctr0++){
param[ctr0].keyword = "";
param[ctr0].value = 0;
}
好的一些快速解释。initParams 用于为我的每个参数分配内存。我假设我不知道字符串中将包含多少参数,并计划稍后在程序中确定字符串中的数字。我知道我不会接受超过字符串中的参数。
分配内存后,我循环遍历每一个并将每个值初始化为空字符串或 0。(我确实意识到这可能是不必要的,但是我已经将其作为代码故障排除的一部分。
继续,replaceSpaces() 简单地循环遍历字符串并将每次出现的 ' ' 替换为 '\0'。它还计算字符串中存在的争论数量,以便我知道我刚刚通过添加空终止符创建了多少新字符串。
现在是我遇到困难的棘手部分。
#define MAX_ARG_LENGTH 20
void findWords(parameter* param, char* str0, int num_arg){
parameter temp[countWords(str0, num_arg)];
int i;
int ctr0,ctr1, ctr2=0;
int word=0; //flag
char tempStr[MAX_ARG_LENGTH]="";
char* c0 = str0;
for(ctr0=0; ctr0<num_arg; ctr0++){
word=0;
ctr1=0;
if(((*c0 > 'a') && (*c0 <'z')) || ((*c0 > 'A') && (*c0 <'Z'))){
word=1;
tempStr[ctr1]=*c0;
ctr1++;
}
while(*c0 != '\0'){
c0++;
if(word)
tempStr[ctr1++] = *c0;
printf("\ntempStr: '%s'\n", tempStr);
}
if(word){
param[ctr2].keyword = tempStr;
printf("%s\n", param[ctr2].keyword);
ctr2++;
}
c0++;
}
for(i=0; i<num_arg/2;i++){
printf("'%s'\n", param[i].keyword);
printf("'%g'\n", param[i].value);
}
}
此函数在查找字符串中的每个单词并将其存储在 tempStr 中时正常工作。我的问题是将它分配给我的 main() 中的参数数组。我尝试将它们分配给临时参数数组,然后将“参数”设置为等于临时数组。然而,由于 param 是一个指针,当我为它分配一个本地位置时,函数完成后,内存被释放和丢失。输入我的想法,使用 malloc 为它们预定义内存并在之后分配。
这是我编译和运行代码时的当前输出。我添加了评论以澄清
16 //sizeof(参数)
5 //str0中的字数
剩下
去
去
停止
对
'RIGHT' //单引号中的内容是从参数数组中打印出来的
'8.05316e-315'
'对'
'0'
'对'
'8.04051e-315'
'对'
'0'
'对'
'0'
MAIN: //我使用 findWord() 中相同的 for 循环在 main 中打印了这些
'▒▒'
'8.05316e-315'
'▒▒'
'0'
'▒▒'
'8.04051e-315'
'▒▒'
'0'
'▒▒'
'0'
如果有人可以帮助我正确地将 tempStr 的内容分配给我在 main 中声明的数组中的参数,我将不胜感激。如果您需要更多信息,请告诉我。
谢谢你们!!我得到了它!!!
我没有制作“tempStr”,而是将字符直接分配给 param[index].keyword。它就像一个魅力
非常感谢你们!我已经阅读了许多不同的 Qs 和 As here,但这是我第一次发帖。我对你们能够如此迅速地回复感到非常兴奋。
再次感谢!
〜尼克