将函数中创建的字符串分配给在main中创建的typedef结构数组

时间:2012-12-16 01:37:22

标签: c arrays pass-by-reference typedef

好的。所以我在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,但这是我第一次发帖。我很高兴你们能够以多快的速度回复。

再次感谢!

〜尼克

1 个答案:

答案 0 :(得分:0)

我认为您误解了param[ctr2].keyword = tempStr;的作用。它不会将tempstr中的字符串复制到keyword只会使keyword指向tempstr,表示所有关键字都将指向tempStr变量,如果您在此功能之外访问它,则无效。

你想做的是做

char* keyword;

进入

char keyword[MAX_ARG_LENGTH];

并使用strcpystrncpy之类的内容进行复制。

您似乎也没有在任何地方设置value