Struct字符串元素未保留指定值

时间:2013-09-27 17:09:00

标签: c string struct

我对C有点奇怪的问题。

我有一个实现结构的.c文件,另一个使用它。有问题的结构是关于学生的基本信息(姓名和年级)。 Implementation文件具有函数

  • 初始化
  • 读取姓名
  • 读取成绩
  • 可用内存(删除实例)

主文件如下:

int main (void){
    char inBuff[30];
    char* name = NULL;
    int grade;
    Student Stu;

    printf("main: Please enter the name\n");
    fgets(inBuff, 30, stdin);
    name = malloc((sizeof(char)+1)*strlen(inBuff));
    strncpy (name, inBuff, 20);

    printf("main: Please enter the grade\n");
    scanf("%d", &grade);

    InitializeStudent (name, grade, &Stu);

    /*value testing*/
    printf("main: %s\n", Stu.name);
    printf("main: %d\n", Stu.grade);

    printf ("main: The student's name is %s\n", NameOfStudent(Stu));
    printf ("main: The student's grade is %d\n", GradeOfStudent(Stu));

    FreeStudent(&Stu);
    free (name);
    return 0;
}
printf()函数中的

InitializeStudent()语句似乎显示正确分配的值。但是,Stu.nameNameOfStudent(Stu)都返回ASCIIStu.GradeGradeOfStudent(Stu)返回2675716(这似乎是一个内存地址),无论输入

值得注意的是,已经指定NameOfStudent()GradeOfStudent()是值传递而不是使用指针(即应该制作结构的副本并传入函数)并分别有char*int返回类型,而InitializeStudent()传递一个指针并且是一个void函数。

同样重要的是,Student的名称字段初始化为

char name[20];

而不是

char* name;

Student结构定义如下:

#define MAXNAMESIZE 20
typedef struct {
    char name[MAXNAMESIZE];
    int grade;
} Student;

根据要求,初始化学生的代码如下

void InitializeStudent (char *name, int grade, Student *S) {
    printf ("InitializeStudent: entered initialization\n");
    int i = 0;
    S = malloc (sizeof(Student));
    for (i = 0; i< strlen(name); i++)
        if (name[i] == '\n')
            name[i] = '\0';
    strncpy(S->name, name, 20);
    S->grade = grade;

    printf ("InitializeStudent: %s\n", S->name);
    printf ("InitializeStudent: %d\n", S->grade);
}

1 个答案:

答案 0 :(得分:2)

问题在于,当您向Student函数传递指向已分配结构的指针时,会在InitializeStudent函数中分配S结构。

因为参数是通过值(即复制)传递给函数的,所以指针main是一个副本,所以当你赋值给它时,你只能在函数中分配你的本地副本。这就是InitializeStudent函数中的结构未初始化的原因,因为您只初始化在strncpy函数中分配的结构,而不是您传入的结构。

最后,请小心fgets,好像源字符串的长度超过传递给它的长度,然后函数将添加字符串终止符。


哦,顺便说一下,有一种更简单的方法可以从/* If `name` is not a `NULL` pointer, and the length is larger than zero * and the last character is a newline... */ if (name != NULL && strlen(name) > 0 && name[strlen(name) - 1] == '\n') name[strlen(name) - 1] = '\0'; 删除换行符:只需“删除”最后一个字符:

{{1}}