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

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

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

Доброго времени суток! Пишу программу, которая работает с базой данных студентов. Для структуры "Student" реализовал метод studentToString() который представляет ее в виде текста и встретился с совсем непонятной мне проблемой: первый вызов метода срабатывает хорошо и печатается что и должно быть, а при втором вызове печатается мусор Есть догадка, что в методе strcat() есть какие-то подводные камни, но гуглом их не нашел. Работаю в Code::Blocks, компилятор gcc Прошу помощи в исправлении этой проблемы уже и не знаю что делать, заранее спасибо. //student.c
Листинг программы
  1. #include <string.h>
  2. typedef int field;
  3. const field stName = 1;
  4. const field stSurname = 2;
  5. const field stGroup = 3;
  6. const field stDoc = 4;
  7. const field stSex = 5;
  8. const field stBirthday = 6;
  9. const field stMaths = 7;
  10. const field stChemistry = 8;
  11. const field stPhysics = 9;
  12. const field stProgramming = 10;
  13. const field stEnglish = 11;
  14. struct Student
  15. {
  16. char name [256];
  17. char surname [256];
  18. char group_number[256];
  19. char doc_number [256];
  20. char sex [256];
  21. char birthday [256];
  22. char maths [256];
  23. char chemistry [256];
  24. char physics [256];
  25. char programming [256];
  26. char english [256];
  27. };
  28. struct Student *studentCreate()
  29. {
  30. struct Student student;
  31. studentSetField(&student, stName, "--");
  32. studentSetField(&student, stSurname, "--");
  33. studentSetField(&student, stGroup, "--");
  34. studentSetField(&student, stDoc, "--");
  35. studentSetField(&student, stSex, "--");
  36. studentSetField(&student, stBirthday, "--");
  37. studentSetField(&student, stMaths, "--");
  38. studentSetField(&student, stChemistry, "--");
  39. studentSetField(&student, stPhysics, "--");
  40. studentSetField(&student, stProgramming, "--");
  41. studentSetField(&student, stEnglish, "--");
  42. return &student;
  43. };
  44. void studentSetField(struct Student *student, field fieldName, char *str)
  45. {
  46. switch(fieldName)
  47. {
  48. case 1:
  49. strcpy(student->name, str);
  50. break;
  51. case 2:
  52. strcpy(student->surname, str);
  53. break;
  54. case 3:
  55. strcpy(student->group_number, str);
  56. break;
  57. case 4:
  58. strcpy(student->doc_number, str);
  59. break;
  60. case 5:
  61. strcpy(student->sex, str);
  62. break;
  63. case 6:
  64. strcpy(student->birthday, str);
  65. break;
  66. case 7:
  67. strcpy(student->maths, str);
  68. break;
  69. case 8:
  70. strcpy(student->chemistry, str);
  71. break;
  72. case 9:
  73. strcpy(student->physics, str);
  74. break;
  75. case 10:
  76. strcpy(student->programming, str);
  77. break;
  78. case 11:
  79. strcpy(student->english, str);
  80. break;
  81. }
  82. };
  83. void studentToString(struct Student *student, char *str)
  84. {
  85. strcpy(str, "Name: ");
  86. strcat(str, student->name);
  87. strcat(str, "\n");
  88. strcat(str, "Surname: ");
  89. strcat(str, student->surname);
  90. strcat(str, "\n");
  91. strcat(str, "Group number: ");
  92. strcat(str, student->group_number);
  93. strcat(str, "\n");
  94. strcat(str, "Doc number: ");
  95. strcat(str, student->doc_number);
  96. strcat(str, "\n");
  97. strcat(str, "Sex: ");
  98. strcat(str, student->sex);
  99. strcat(str, "\n");
  100. strcat(str, "Birthday: ");
  101. strcat(str, student->birthday);
  102. strcat(str, "\n");
  103. strcat(str, "Maths: ");
  104. strcat(str, student->maths);
  105. strcat(str, "\n");
  106. strcat(str, "Chemistry: ");
  107. strcat(str, student->chemistry);
  108. strcat(str, "\n");
  109. strcat(str, "Physics: ");
  110. strcat(str, student->physics);
  111. strcat(str, "\n");
  112. strcat(str, "Programming: ");
  113. strcat(str, student->programming);
  114. strcat(str, "\n");
  115. strcat(str, "English: ");
  116. strcat(str, student->english);
  117. strcat(str, "\n");
  118. }
student.h
Листинг программы
  1. #ifndef STUDENT_H_INCLUDED
  2. #define STUDENT_H_INCLUDED
  3. typedef int field;
  4. const field stName;
  5. const field stSurname;
  6. const field stGroup;
  7. const field stDoc;
  8. const field stSex;
  9. const field stBirthday;
  10. const field stMaths;
  11. const field stChemistry;
  12. const field stPhysics;
  13. const field stProgramming;
  14. const field stEnglish;
  15. struct Student;
  16. struct Student *studentCreate();
  17. void studentToString(struct Student *student, char *str);
  18. void studentSetField(struct Student *student, field fieldName, char *str);
  19. #endif // STUDENT_H_INCLUDED
main.c
Листинг программы
  1. #include "student.h"
  2. int main()
  3. {
  4. struct Student *s;
  5. s = studentCreate();
  6. char b[1024];
  7. studentToString(s, b);
  8. printf("%s", b);
  9. studentToString(s, b);
  10. printf("%s", b);
  11. return 0;
  12. }

Решение задачи: «Некорректное поведение программы, работа со строками»

textual
Листинг программы
  1. struct Student *studentCreate()
  2. {
  3. * * struct Student student; // так нельзя делать!!!!!!!!!!
  4. studentSetField(&student, stName, "--");
  5. * * studentSetField(&student, stSurname, "--");
  6. * * studentSetField(&student, stGroup, "--");
  7. * * studentSetField(&student, stDoc, "--");
  8. * * studentSetField(&student, stSex, "--");
  9. * * studentSetField(&student, stBirthday, "--");
  10. * * studentSetField(&student, stMaths, "--");
  11. * * studentSetField(&student, stChemistry, "--");
  12. * * studentSetField(&student, stPhysics, "--");
  13. * * studentSetField(&student, stProgramming, "--");
  14. * * studentSetField(&student, stEnglish, "--");
  15. return &student;
  16. };

Объяснение кода листинга программы

В данном коде определен функционал для создания структуры данных Student. Код начинается с объявления указателя на структуру Student с именем student. Далее, с помощью функции studentSetField происходит установка значений полей структуры Student. После этого, возвращается адрес созданной структуры student. Список действий:

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

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут