好的。所以我在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);
}
initParams在:
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”设置为等于临时数组。但是由于param是一个指针,当我为它指定一个本地位置时,在该函数完成后,内存被释放并丢失。输入我的想法,使用malloc为它们预定义内存并在之后分配。
这是我编译和运行代码时的当前输出。我添加了评论以澄清
16 // sizeof(参数)
5 // str0中的单词数
LEFT
GO
GO
STOP
RIGHT
'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。它就像一个魅力
非常感谢你们!我之前读过许多不同的Q和As,但这是我第一次发帖。我很高兴你们能够以多快的速度回复。
再次感谢!
〜尼克
答案 0 :(得分:0)
我认为您误解了param[ctr2].keyword = tempStr;
的作用。它不会将tempstr
中的字符串复制到keyword
只会使keyword
指向tempstr
,表示所有关键字都将指向tempStr
变量,如果您在此功能之外访问它,则无效。
你想做的是做
char* keyword;
进入
char keyword[MAX_ARG_LENGTH];
并使用strcpy
或strncpy
之类的内容进行复制。
您似乎也没有在任何地方设置value