Некорректное поведение программы, работа со строками - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д