xinkuzix 发表于 2024-9-7 12:19

c语言结构体内字符数组问题

请教有空的老师:
c语言,程序如下,在堆上建个结构体链表,因结构体内字符数组char name,请问怎么才能在函数 insert_n()中给新插入的结构体内的字符数组name赋值?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 30

struct bd{
int year;
int month;
int day;
};

struct stu{
    int id;
    char name;
    struct bd b;
struct stu * next;
};


void init_stu(struct stu * l) {
    l = (struct stu *) malloc(sizeof(struct stu));
    l->id = 0;
    memset(l->name, 0, sizeof(l->name)); //这样初始化stu.name为空能行吗?
    l->b.year = 0;
    l->b.month = 0;
    l->b.day = 0;
    l->next = NULL;

    if (l == NULL) {
      printf("wrong!\n");
    }   
}

void create_stu(struct stu * l) {
    struct stu * tail_l = l;
    int len = 0;
   
    while (len <= 0) {
      printf("input some students: \n");
      scanf("%d", &len);
    }   

    int i;
   for (i = 0; i < len; i++) {
      struct stu * note = (struct stu *)malloc(sizeof(struct stu));
      scanf("%d", &(note->id));
      scanf("%s", note->name);
      scanf("%d", &(note->b.year));
      scanf("%d", &(note->b.month));
      scanf("%d", &(note->b.day));

      note->next = NULL;
      tail_l->next = note;
      tail_l = note;
    }
    printf("end.\n");

    }


struct stu * find_n(struct stu * l, int n) {
    struct stu * p = l;
    int i;
    for (i = 0; i < n; i++) {
      if (p == NULL) {
            printf("not find!\n");
            return NULL;
      }
      p = p->next;
    }
    return p;
}

void insert_n(struct stu * l, int n, int id,       int year, int month, int day) {
    struct stu * p = find_n( l, n);
    struct stu * note = (struct stu *)malloc(sizeof(struct stu));
    note->id = id;
//memcpy(note->name, "xinzeng");    怎么给note->name 赋值?
    note->b.year = year;
    note->b.month = month;
    note->b.day = day;
    note->next = p->next;
    p->next = note;
}


int length(struct stu * l) {
    struct stu * p = l;
    int len = 0;

    if (p->next != NULL) {
      p = p->next;
      len++;
    }
    return len;
}


int del_n(struct stu * l, int n) {
    struct stu * pre = find_n(l, n-1);
    if (pre->next == NULL) {
      printf("i can not\n");
      return 0;
    }
    struct stu * p = pre->next;
    pre->next = p->next;
    free(p);
    return 1;
}

void print_l(struct stu * l) {
    struct stu * p = l->next;
    while (p != NULL) {
      printf("id=%d name=%s birthday:%d year %d month %d day.\n",
                p->id, p->name, p->b.year, p->b.month, p->b.day);
      p = p->next;
    }
}

int main() {

        reutrn 0;
}

DEATHTOUCH 发表于 2024-9-7 18:02

memset 置0当然可以了,字符串拷贝用 strcpy_s 或者 strncpy_s 就行了。

xinkuzix 发表于 2024-9-7 18:29

DEATHTOUCH 发表于 2024-9-7 18:02
memset 置0当然可以了,字符串拷贝用 strcpy_s 或者 strncpy_s 就行了。

void insert_n(struct stu * l, int n, int id,       int year, int month, int day) {
    struct stu * p = find_n( l, n);
    struct stu * note = (struct stu *)malloc(sizeof(struct stu));
    note->id = id;
//memcpy(note->name, "xinzeng");    怎么给note->name 赋值?
    note->b.year = year;
    note->b.month = month;
    note->b.day = day;
    note->next = p->next;
    p->next = note;
}
这个在链表中插入一个包含char字符数组的结构体对象,char字符数组内容比如“zhangsan"怎么传参,第一行空白处那个形参怎么写{:1_893:}

DEATHTOUCH 发表于 2024-9-7 18:34

xinkuzix 发表于 2024-9-7 18:29
void insert_n(struct stu * l, int n, int id,       int year, int month, int day) {
    struct stu ...

如果你用的不是微软的编译器,嫌麻烦的话直接 strcpy 就行了,就是你注释那样的写法呀。
如果是微软的编译器,就看看微软的文档,也没差多少。

xinkuzix 发表于 2024-9-7 18:50

DEATHTOUCH 发表于 2024-9-7 18:34
如果你用的不是微软的编译器,嫌麻烦的话直接 strcpy 就行了,就是你注释那样的写法呀。
如果是微软的编 ...

”void insert_n(struct stu * l, int n, int id,                   int year, int month, int day){....} “,
void insert_n(struct stu * l, int n, int id, ”zhangsan“, int year, int month, int day) {...}
像第二行这样参数不行吧,我想能不能把”zhangsan"这个字符串通过参数传进去,有没有办法?

LuGuanDi 发表于 2024-9-7 19:06

字符串传参用指针,char *,常量字符串加上const 修饰。
复制字符串,调用strcpy函数。

xinkuzix 发表于 2024-9-7 19:13

LuGuanDi 发表于 2024-9-7 19:06
字符串传参用指针,char *,常量字符串加上const 修饰。
复制字符串,调用strcpy函数。

今天累了,明天我试试,谢谢。我功力太差,不过觉得好像没那么简单~

Ares157 发表于 2024-9-7 20:44

xinkuzix 发表于 2024-9-7 19:13
今天累了,明天我试试,谢谢。我功力太差,不过觉得好像没那么简单~

形参写char* str,调用的时候传"zhangsan"就是传字符串首地址了,就这么简单。。

xinkuzix 发表于 2024-9-8 09:30

Ares157 发表于 2024-9-7 20:44
形参写char* str,调用的时候传"zhangsan"就是传字符串首地址了,就这么简单。。

果然如此,谢谢。

xinkuzix 发表于 2024-9-8 18:15

Ares157 发表于 2024-9-7 20:44
形参写char* str,调用的时候传"zhangsan"就是传字符串首地址了,就这么简单。。

麻烦老师给看下:现在的printmy()函数只能打出一个struct,能样改才能把struct d1 d2 d2全打出来{:1_919:}

#include <stdio.h>
#include <stdlib.h>

typedef struct test{
    int data;
    struct test * next;
}test;

void printmy(test *phead){
    if (phead != NULL){
    printf("%d %p \n", phead->data, phead->next);
    phead = phead->next;
    }
}

int main() {
    test * d1 = (test *)malloc(sizeof(test));
    d1->data = 100;
    d1->next = NULL;

    test * d2 = (test *)malloc(sizeof(test));
    d2->data = 200;
    d2->next = NULL;
    d1->next = d2;

    test * d3 = (test *)malloc(sizeof(test));
    d3->data = 300;
    d3->next = NULL;
    d2->next = d3;


    printmy(d1);

}
页: [1] 2
查看完整版本: c语言结构体内字符数组问题