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