soonwalker 2022-06-28 02:38 采纳率: 81.8%
浏览 90
已结题

C语言函数参数为数组时值传递失败

运行环境:vs2022;
问题背景:写一个家谱的操作系统
现象:函数参数为字符串数组时传递参数失败

问题相关代码

img

img

我的解答思路和尝试过的方法 、

感觉是insertfnc()函数没有接受到传递的参数
我试着改了一下形参名字,或者改成将参数形式改成char fname[MAX],也没有用
看了网上一些讲这个内容的,感觉自己应该没有写错。难道是错在其他地方了吗?

源码如下:
/有没有很懂孩兄二叉树的兄弟,后面功能还有好多疑问,这是摘取了一部分功能调试,如果您愿意帮忙指点一二真的感激不尽!(付费咨询也可
以),自己解决问题的效率太伤了
/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include<windows.h>
#define MAX 10

typedef struct
{
int generation;
char name[MAX];
int sex;//1为男,0为女
}DataType;
//此为数据域的类型定义,若想实现更多的数据要求,应在此加入更多数据类型的定义。

typedef struct Node
{
DataType person;
struct Node* lchild, * rbrother, * father;
}node, * tree;
//利用孩兄弟表示法来表示每个结点。

tree createNode();
void insertfnc(char);
tree find(tree, char);//寻找到对应姓名对应的结点并用全局变量指针记录
void create();
//int NamePreOrderTraverse(tree T, char name[20]);
tree BT=NULL;
tree p=NULL;

int main()
{
p = (tree)malloc(sizeof(node));
create();
return 1;
}

void create()
{
printf("请遵从提示从大到小插入家谱中的人物(先输入者必是年龄大者):\n");
char name[MAX];
char fname[MAX];
BT=createNode();
printf("\n您已完成创建根节点");
int flag = 0;//标记是否继续输入。
while (!flag)
{
printf("\n输入“0”继续插入新的成员,输入其他退回主界面\n");
scanf_s("%d", &flag);
getchar();
if (!flag)
{
printf("\n输入新成员父亲姓名:");
scanf_s("%s", fname, sizeof(fname)+1);
getchar();
printf("插入之前:%s",fname);
insertfnc(fname);
}
}
}

tree createNode()
{
tree q = (tree)malloc(sizeof(node));
printf("请输入被添加成员的姓名(长度小于5个字):");
char name[MAX];
scanf_s("%s",name,MAX); getchar();
strcpy_s(q->person.name,MAX,name);
q->person.generation = 1;
q->person.sex = 1;
q->rbrother = NULL;
q->lchild = NULL;
q->father = NULL;
return q;
}
void insertfnc(char *fname)
{
printf("到这还是好好的\n");
printf("插入中:%s", fname);
tree son=(tree)malloc(sizeof(node));
p=find(BT,fname);

     if (!p) {
         printf("插入失败,查无其父\n按回车键以继续...");
         getchar();
         system("cls");
         return;
     }
     son=createNode();

     son->father = p;//完成对插入点信息的补充
     son->person.generation = p->person.generation + 1;
     printf("请输入插入者的性别(1为男性,0为女性):");
     scanf_s("%d", &(son->person.sex));
     getchar();


     if (p->lchild == NULL) p->lchild = son;
     else {
         tree bro = p->lchild;
         while (bro->rbrother != NULL) bro = bro->rbrother;
         son = bro->rbrother;
     }
     printf("插入成功!");
     return;
 }

tree find(tree A, char name[MAX])
{

if (!A)  return NULL;
else
{
    printf("确实是%s\n", A->person.name);
    if (strcmp(A->person.name, name) == 0)
    {
        return A;
    }
   /* else return find(A->lchild, name);

    if(strcmp(A->person.name,name)!=0)    return find(A->rbrother, name);*/

   
}

}

  • 写回答

2条回答 默认 最新

  • it_hao528 2022-06-28 08:41
    关注

    刚试了怎么传值是可以的,其实字符数组也是指针,这么传理论上没有问题。
    你可以尝试修改将fname也定义成指针试试
    char *fname = (char *)malloc(sizeof(char));

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月13日
  • 已采纳回答 7月5日
  • 创建了问题 6月28日

悬赏问题

  • ¥15 华为nova10pro ,关闭热动热点用量记录
  • ¥15 JavaFX启动SceneBuilder报错,找不到fxml文件
  • ¥15 树莓派ubuntu使用conda就提示core dumped
  • ¥15 帮我看看这是个啥题,带解题过程和结果,条件如下FCF = 290471.33 g1 = 15% r = 8% g2 = 4% n = 5
  • ¥15 edem模拟颗粒不显示或者生成失败
  • ¥15 Python代码编写
  • ¥15 php 将rtmp协议转hls协议,无法播放
  • ¥20 python代码编写
  • ¥20 使用MPI广播数据遇到阻塞
  • ¥15 TinyMCE如何去掉自动弹出的“链接…”工具?