1

好的。所以我在 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,但这是我第一次发帖。我对你们能够如此迅速地回复感到非常兴奋。

再次感谢!

〜尼克

4

1 回答 1

0

I think you are misunderstanding what param[ctr2].keyword = tempStr; does It does not copy the string in tempstr to keyword it just makes keyword point to tempstr, which means all the keywords will point to the tempStr variable and will be invalid if you access it outside this function.

What you want to do is to make

char* keyword;

into

char keyword[MAX_ARG_LENGTH];

And use something like strcpy or strncpy to do the copying.

You also do not appear to be setting value anywhere

于 2012-12-16T01:45:48.857 回答