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

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 用verilog实现tanh函数和softplus函数
  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 51寻迹小车定点寻迹
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题