gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:52:17 24 4
gpt4 key购买 nike

好的。所以我在 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”设置为等于临时数组。但是由于 param 是一个指针,当我为它分配一个本地位置时,函数完成后,内存被释放并丢失。输入我的想法使用malloc为它们预定义内存并在之后分配。

这是我编译和运行代码时的当前输出。我添加了评论以澄清

16 //sizeof(parameter)

5 //Number of words in str0

LEFT

GO

GO

STOP

RIGHT

'RIGHT' //Things in single quotes are prints from the array of parameters

'8.05316e-315'

'RIGHT'

'0'

'RIGHT'

'8.04051e-315'

'RIGHT'

'0'

'RIGHT'

'0'

MAIN: //I printed these in main using the same for loop seen in findWord()

'▒▒'

'8.05316e-315'

'▒▒'

'0'

'▒▒'

'8.04051e-315'

'▒▒'

'0'

'▒▒'

'0'

如果有人能帮助我正确地将 tempStr 的内容分配给在 main 中声明的数组中的参数,我将不胜感激。如果您需要更多信息,请告诉我。

谢谢大家!!我明白了!!!

我没有生成“tempStr”,而是直接将字符分配给了参数[索引].关键字。它就像一个魅力

非常感谢大家!我以前在这里读过很多不同的 Qs 和 As,但这是我第一次发帖。我对你们回复的速度感到非常兴奋。

再次感谢!

~尼克

最佳答案

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

你想做的就是做

char* keyword;

进入

char keyword[MAX_ARG_LENGTH];

然后使用类似strcpystrncpy 的东西来进行复制。

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

关于c - 将在函数中创建的字符串分配给在 main 中创建的 typedef 结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13897835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com