Некорректное поведение программы, работа со строками - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! Пишу программу, которая работает с базой данных студентов. Для структуры "Student" реализовал метод studentToString() который представляет ее в виде текста и встретился с совсем непонятной мне проблемой: первый вызов метода срабатывает хорошо и печатается что и должно быть, а при втором вызове печатается мусор Есть догадка, что в методе strcat() есть какие-то подводные камни, но гуглом их не нашел. Работаю в Code::Blocks, компилятор gcc Прошу помощи в исправлении этой проблемы уже и не знаю что делать, заранее спасибо. //student.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");
}
student.h
#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
main.c
#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. Список действий:

  1. Объявление указателя на структуру Student с именем student.
  2. Вызов функции studentSetField для установки значений полей структуры Student.
  3. Возврат адреса созданной структуры student.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4 из 5