Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 协助函数中指向动态分配的结构数组的指针?_C_Arrays_Struct_Malloc_Dynamic Memory Allocation - Fatal编程技术网

C 协助函数中指向动态分配的结构数组的指针?

C 协助函数中指向动态分配的结构数组的指针?,c,arrays,struct,malloc,dynamic-memory-allocation,C,Arrays,Struct,Malloc,Dynamic Memory Allocation,我正在做一个关于收集系外行星元素的游戏。 如果我能在一个函数中完成这一切,我就不会有问题了,但我会将结构数组的指针传递给多个函数。所以我不断地出错,因为我不知道每个函数的参数和参数有多少个指针。 尤其是函数中的函数(称为missionMenu())是一个令人头疼的问题。我也可能把函数earth()中的指针弄乱了。。 任何帮助都将不胜感激 编辑:我需要帮助修复missionMenu()函数中的scanf,我认为上面提到的指针滥用与此有关 #include <stdio.h> #incl

我正在做一个关于收集系外行星元素的游戏。 如果我能在一个函数中完成这一切,我就不会有问题了,但我会将结构数组的指针传递给多个函数。所以我不断地出错,因为我不知道每个函数的参数和参数有多少个指针。 尤其是函数中的函数(称为missionMenu())是一个令人头疼的问题。我也可能把函数earth()中的指针弄乱了。。 任何帮助都将不胜感激

编辑:我需要帮助修复missionMenu()函数中的scanf,我认为上面提到的指针滥用与此有关

#include <stdio.h>
#include <stdlib.h>
#define pause system("pause")
#define cls system("cls")
#define flush fflush(stdin)
#define SIZE 1000


main(){

    int count=0;

    ELEMENT* element[SIZE];
    earth(&count,element);

}//End main 

void earth(int *c,ELEMENT **element){

    int userMenuChoice = 0; 
    int i;
    int number;
    displayMenu(); 

    element[*c] = malloc(sizeof(ELEMENT));

    scanf("%i", &userMenuChoice); 

    switch (userMenuChoice) { 
            case 1: 

                missionMenu(element[*c],*c);

                break; 
            case 2: 
                for(i=0;i<*c;i++)
                    printf("\t%i\t%i\n", element[i]->hydrogen);
                break; 
            case 3: 

                break;
    }while(userMenuChoice != 4); 

}//end end

void missionMenu(ELEMENT *element, int c ){
    int missionChoice;
    cls;

    printf("Which planet would you like to escapade/exploit? \n\n"); 
    printf("1. Gliese 436 b \n");
    printf("2. Oxygen Planet\n"); 
    printf("3. 55 Cancri E\n"); 
    printf("4. Nitrogen \n"); 
    printf("Please input your choice (1-3): \n\n"); 

    missionChoice = 0; 
    scanf("%i", &missionChoice); 
    switch (missionChoice) { 
            case 1: 

                cls;
                printf("\n\n\nWelcome to Planet Gliece 436 b, a planet made of burning ice.\n");
                printf("The extreme gravity of this planet forces the water to stay in solid form,\neven though the temperature is over 570° fahrenheit.\n\n");
                pause;




                printf("\n\n\tHow much Hydrogen would you like to collect?");
                //scanf("%i",&collect);
                scanf("%[^\n]s", element->hydrogen); flush;
                printf("\n\ntHow much Oxygen would you like to collect?");
               // scanf("%i",&collect);
                scanf("%[^\n]s", element->oxygen); flush;
                c=c+1;
                break; 
            case 2: 

                break; 
            case 3: 

                break;
            case 4:

                break;
    }while(missionChoice != 5); 
}//end mission menu



ELEMENT** newElement() {
    ELEMENT** element;
    element = malloc(sizeof(ELEMENT));
    return element;
} //end newTeam
#包括
#包括
#定义暂停系统(“暂停”)
#定义cls系统(“cls”)
#定义刷新刷新(标准输入)
#定义大小1000
main(){
整数计数=0;
元素*元素[大小];
接地(计数和元素);
}//端干管
空接地(int*c,元件**元件){
int userMenuChoice=0;
int i;
整数;
显示菜单();
元素[*c]=malloc(sizeof(元素));
scanf(“%i”和userMenuChoice);
开关(userMenuChoice){
案例1:
任务菜单(要素[*c],*c);
打破
案例2:
对于(i=0;i氢);
打破
案例3:
打破
}while(userMenuChoice!=4);
}//结束
无效任务菜单(元素*元素,int c){
国际使命选择;
cls;
printf(“你想逃避/利用哪个星球?\n\n”);
printf(“1.Gliese 436 b\n”);
printf(“2.氧气行星”\n);
printf(“3.55 Cancri E\n”);
printf(“4.氮气”);
printf(“请输入您的选择(1-3):\n\n”);
使命选择=0;
scanf(“%i”和任务选择);
开关(任务选择){
案例1:
cls;
printf(“\n\n\n欢迎来到Gliece436b行星,一颗由燃烧的冰构成的行星。\n”);
printf(“尽管温度超过570华氏度,但这颗行星的极端重力迫使水保持固体状态。\n\n”);
暂停;
printf(“\n\n\t您希望收集多少氢气?”);
//scanf(“%i”、&collect);
scanf(“%[^\n]s”,元素->氢);冲洗;
printf(“\n\n您希望收集多少氧气?”);
//scanf(“%i”、&collect);
扫描(“%[^\n]s”,元素->氧气);冲洗;
c=c+1;
打破
案例2:
打破
案例3:
打破
案例4:
打破
}while(任务选择!=5);
}//结束任务菜单
元素**新元素(){
元素**元素;
元素=malloc(sizeof(元素));
返回元素;
}//结束新团队

main
中,您尝试使用指向元素(数组)的指针调用
earth
函数。如果您检查
地球(…)
的定义,您会发现它接受指向元素指针的指针,而不是您要传递的元素。

您的问题是什么?如何修复指针,使scanf和Mission MENUCA都能工作?您可以尝试将问题减少到表示问题的最小子集吗?您已经发布了很多可能不相关的代码。请在问题本身中澄清这一点,否则人们会投票以不清楚的方式结束它。这严重需要细分,但对于您发现的部分,格式字符串
“%[^\n]s”
将尝试将以
“\n”
结尾的字符串分配给
,然后尝试获取并丢弃
字符
hydrogen
oxygen
甚至都不是一开始就可以容纳字符串的字符数组。。。如果您只想在里面存储数字,只需使用格式字符串
%d”
,以及第二个参数
&element->hydrogen
&element->oxygen
。如果您希望反复发出
switch
语句,直到
missionChoice==5为止,然后用
while
like
while(…){switch{…}
switch
括起来,如果你想
switch
至少被评估一次,用
do
like
do{switch{…}}while(…)将你的
switch
括起来这确实是我的意思,然后你应该更新你的答案以使用正确的术语:-)这种编辑目前不是我能够成功进行的编辑。