我有一個有點古怪的問題與C.字符串元素不保留指定的值
我有一個.c
文件實施的結構,另一個使用它。有問題的結構是關於學生的基本信息(姓名和成績)。實現文件具有的功能
- 初始化
- 讀名
- 讀年級
- 釋放內存(刪除實例)
主文件去如下:
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()
st InitializeStudent()
函數中的函數似乎顯示正確賦值的值。然而,無論輸入如何,Stu.name
和NameOfStudent(Stu)
都返回ASCII
,並且Stu.Grade
和GradeOfStudent(Stu)
返回2675716
(其似乎是存儲器地址)。
值得注意的是,它已經被指定NameOfStudent()
和GradeOfStudent()
是通過按值,而不是使用一個指針(即,應使該結構的副本,並在傳遞給功能)和具有char*
和事實int
分別返回類型,而InitializeStudent()
傳遞一個指針並且是一個void函數。
而且可能重要的是,學生的姓名字段作爲
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);
}
請考慮縮進你的代碼,並添加的聲明'struct Student'。編輯:對,我注意到代碼是縮進,除非你使用製表符。對於SO,最好在發佈之前將縮進轉換爲編輯器中的空格。 – millimoose
也可能重要的是提供給我們'NameOfStudent'和'GradeOfStudent'的實現。 –
請顯示'InitializeStudent(name,grade,&Stu)'的代碼' – StarPilot