【问题标题】:Assign a string created in a function to a typedef structure array created in main将函数中创建的字符串分配给 main 中创建的 typedef 结构体数组
【发布时间】:2012-12-03 14:02:46
【问题描述】:

好的。所以我在 C 语言中有这个程序,我在其中获取一个带有参数和值的字符串(例如:“GO 45 STOP 15”)。目标是解析字符串并将参数及其对应值放入 typedef 结构中以供以后使用。

这是我的结构的样子:

typedef struct {
    char* keyword;
    double value;
} parameter;

以下是我遇到问题的一些代码副本。 main() 和 initParams() 都在同一个文件中,因此都可以访问相同的 #defines...

main():

#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 为他们预定义内存并在之后分配。

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

16 //sizeof(参数)

5 //str0中的字数

停止

正确

'RIGHT' //单引号中的内容是参数数组的打印结果

'8.05316e-315'

'正确'

'0'

'正确'

'8.04051e-315'

'正确'

'0'

'正确'

'0'

MAIN: //我在 main 中使用 findWord() 中看到的相同 for 循环打印了这些

'▒▒'

'8.05316e-315'

'▒▒'

'0'

'▒▒'

'8.04051e-315'

'▒▒'

'0'

'▒▒'

'0'

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

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

我只是将字符直接分配给 param[index].keyword,而不是制作“tempStr”。它就像一个魅力

非常感谢你们!我已经阅读了许多不同的 Qs 和 As here,但这是我第一次发帖。我对你们能够如此迅速地回复感到非常兴奋。

再次感谢!

~尼克

【问题讨论】:

  • "如果您需要更多信息,请告诉我" 更多信息?较少的信息会很受欢迎:) 事实上,一个简短的、独立的示例是理想的。
  • parameter temp[countWords(str0, num_arg)]; 这不应该编译..,可能因为它没有被使用而被删除..
  • 是的,我确实意识到这是很多 D:但我觉得如果不彻底解释我的设置,我就无法传达这个问题。
  • countWords() 也返回一个 Int,所以我所做的就是调用“参数 temp[AN_INT_HERE];”并声明临时数组
  • 不允许声明大小不是编译时间常数的数组。

标签: c arrays pass-by-reference typedef


【解决方案1】:

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

你想做的就是做

char* keyword;

进入

char keyword[MAX_ARG_LENGTH];

并使用strcpystrncpy 之类的东西进行复制。

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

【讨论】:

  • 这就是我所害怕的。如果我要将字符串复制到param[ctr2].keyword 中,是否有比逐个字符复制更简单的方法。我试图避免使用预构建的字符串函数,例如 strcpy 等......我编写自己的字符串复制函数没有问题,我只是被我的导师要求不要使用预构建的字符串函数。
  • 好吧..你可以写一个mystrcpy函数来逐个字符地复制并在任何地方使用它。
  • 或者你可以试试 memcpy.. 但你需要注意要复制的字符串的长度等
  • 谢谢你们!当我可以将它放在它所属的位置时,无需复制字符串。 ;) 感谢您的帮助!
猜你喜欢
  • 2012-06-19
  • 1970-01-01
  • 2017-06-12
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多