Некорректное поведение программы, работа со строками - C (СИ)
Формулировка задачи:
Доброго времени суток!
Пишу программу, которая работает с базой данных студентов. Для структуры "Student" реализовал метод studentToString() который представляет ее в виде текста и встретился с совсем непонятной мне проблемой:
первый вызов метода срабатывает хорошо и печатается что и должно быть, а при втором вызове печатается мусор
Есть догадка, что в методе strcat() есть какие-то подводные камни, но гуглом их не нашел.
Работаю в Code::Blocks, компилятор gcc
Прошу помощи в исправлении этой проблемы уже и не знаю что делать, заранее спасибо.
//student.c
student.h
main.c
#include <string.h>
typedef int field;
const field stName = 1;
const field stSurname = 2;
const field stGroup = 3;
const field stDoc = 4;
const field stSex = 5;
const field stBirthday = 6;
const field stMaths = 7;
const field stChemistry = 8;
const field stPhysics = 9;
const field stProgramming = 10;
const field stEnglish = 11;
struct Student
{
char name [256];
char surname [256];
char group_number[256];
char doc_number [256];
char sex [256];
char birthday [256];
char maths [256];
char chemistry [256];
char physics [256];
char programming [256];
char english [256];
};
struct Student *studentCreate()
{
struct Student student;
studentSetField(&student, stName, "--");
studentSetField(&student, stSurname, "--");
studentSetField(&student, stGroup, "--");
studentSetField(&student, stDoc, "--");
studentSetField(&student, stSex, "--");
studentSetField(&student, stBirthday, "--");
studentSetField(&student, stMaths, "--");
studentSetField(&student, stChemistry, "--");
studentSetField(&student, stPhysics, "--");
studentSetField(&student, stProgramming, "--");
studentSetField(&student, stEnglish, "--");
return &student;
};
void studentSetField(struct Student *student, field fieldName, char *str)
{
switch(fieldName)
{
case 1:
strcpy(student->name, str);
break;
case 2:
strcpy(student->surname, str);
break;
case 3:
strcpy(student->group_number, str);
break;
case 4:
strcpy(student->doc_number, str);
break;
case 5:
strcpy(student->sex, str);
break;
case 6:
strcpy(student->birthday, str);
break;
case 7:
strcpy(student->maths, str);
break;
case 8:
strcpy(student->chemistry, str);
break;
case 9:
strcpy(student->physics, str);
break;
case 10:
strcpy(student->programming, str);
break;
case 11:
strcpy(student->english, str);
break;
}
};
void studentToString(struct Student *student, char *str)
{
strcpy(str, "Name: ");
strcat(str, student->name);
strcat(str, "\n");
strcat(str, "Surname: ");
strcat(str, student->surname);
strcat(str, "\n");
strcat(str, "Group number: ");
strcat(str, student->group_number);
strcat(str, "\n");
strcat(str, "Doc number: ");
strcat(str, student->doc_number);
strcat(str, "\n");
strcat(str, "Sex: ");
strcat(str, student->sex);
strcat(str, "\n");
strcat(str, "Birthday: ");
strcat(str, student->birthday);
strcat(str, "\n");
strcat(str, "Maths: ");
strcat(str, student->maths);
strcat(str, "\n");
strcat(str, "Chemistry: ");
strcat(str, student->chemistry);
strcat(str, "\n");
strcat(str, "Physics: ");
strcat(str, student->physics);
strcat(str, "\n");
strcat(str, "Programming: ");
strcat(str, student->programming);
strcat(str, "\n");
strcat(str, "English: ");
strcat(str, student->english);
strcat(str, "\n");
}#ifndef STUDENT_H_INCLUDED #define STUDENT_H_INCLUDED typedef int field; const field stName; const field stSurname; const field stGroup; const field stDoc; const field stSex; const field stBirthday; const field stMaths; const field stChemistry; const field stPhysics; const field stProgramming; const field stEnglish; struct Student; struct Student *studentCreate(); void studentToString(struct Student *student, char *str); void studentSetField(struct Student *student, field fieldName, char *str); #endif // STUDENT_H_INCLUDED
#include "student.h"
int main()
{
struct Student *s;
s = studentCreate();
char b[1024];
studentToString(s, b);
printf("%s", b);
studentToString(s, b);
printf("%s", b);
return 0;
}Решение задачи: «Некорректное поведение программы, работа со строками»
textual
Листинг программы
struct Student *studentCreate()
{
* * struct Student student; // так нельзя делать!!!!!!!!!!
studentSetField(&student, stName, "--");
* * studentSetField(&student, stSurname, "--");
* * studentSetField(&student, stGroup, "--");
* * studentSetField(&student, stDoc, "--");
* * studentSetField(&student, stSex, "--");
* * studentSetField(&student, stBirthday, "--");
* * studentSetField(&student, stMaths, "--");
* * studentSetField(&student, stChemistry, "--");
* * studentSetField(&student, stPhysics, "--");
* * studentSetField(&student, stProgramming, "--");
* * studentSetField(&student, stEnglish, "--");
return &student;
};
Объяснение кода листинга программы
В данном коде определен функционал для создания структуры данных Student.
Код начинается с объявления указателя на структуру Student с именем student.
Далее, с помощью функции studentSetField происходит установка значений полей структуры Student.
После этого, возвращается адрес созданной структуры student.
Список действий:
- Объявление указателя на структуру
Studentс именемstudent. - Вызов функции
studentSetFieldдля установки значений полей структурыStudent. - Возврат адреса созданной структуры
student.