3 / 3 / 1
Регистрация: 27.01.2016
Сообщений: 9

Некорректное поведение программы, работа со строками

26.03.2017, 17:45. Показов 1152. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

Пишу программу, которая работает с базой данных студентов. Для структуры "Student" реализовал метод studentToString() который представляет ее в виде текста и встретился с совсем непонятной мне проблемой:
первый вызов метода срабатывает хорошо и печатается что и должно быть, а при втором вызове печатается мусор
Есть догадка, что в методе strcat() есть какие-то подводные камни, но гуглом их не нашел.

Работаю в Code::Blocks, компилятор gcc

Прошу помощи в исправлении этой проблемы уже и не знаю что делать, заранее спасибо.

//student.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#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
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#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
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.03.2017, 17:45
Ответы с готовыми решениями:

Работа со строками в памяти остается строки после выхода из программы
Суть такова программа работает при первом запуске норм , но после второго чушь какая получается . Str1 сохраняется в памяти( пытался и...

Некорректное поведение скрипта
Здравствуйте. Есть скрипт( его часть - логирование) $Log = 'Ошибка '.$ex-&gt;getMessage().' в строке № '.$ex-&gt;getLine().'...

Некорректное поведение GetClientRect
Есть MDI приложение. Запущено на машине с 2мя мониторами. На втором - маленькое разрешение(1024x768). Когда открывается окошко, там...

4
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
26.03.2017, 17:55
GameDad, *str=0 перед тем как strcat вызывать первый раз.

Добавлено через 2 минуты
Хотя, Вы же сначала strcpy делаете, значит дело не в этом.

Добавлено через 2 минуты
А strlen(b) после первого вызова сколько показывает?

Добавлено через 1 минуту
Цитата Сообщение от GameDad Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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;
};
Локальные переменные уничтожаются после выхода из функции, выделяйте память динамически.
1
3 / 3 / 1
Регистрация: 27.01.2016
Сообщений: 9
26.03.2017, 17:56  [ТС]
shvyrevvg,
Миниатюры
Некорректное поведение программы, работа со строками  
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
26.03.2017, 17:58
Лучший ответ Сообщение было отмечено GameDad как решение

Решение

GameDad, malloc в помощь
1
3 / 3 / 1
Регистрация: 27.01.2016
Сообщений: 9
26.03.2017, 18:00  [ТС]
shvyrevvg, Точно! Спасибо большое! Все получилось
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.03.2017, 18:00
Помогаю со студенческими работами здесь

Некорректное поведение клавиатуры
Поставил Mint 17.3, первые пару дней всё работало нормально, затем с клавиатурой произошла ерунда; 1.ScrollLock постоянно включен; ...

Укажите на недостатки программы (работа со строками)
Здравствуйте! Начал изучать С++ и пытаюсь реализовывать программы из задачника, подскажите пожалуйста, насколько костыльно написал код, что...

Некорректное поведение Java апплета
Всем привет! Я готов, что кто-то будет меня пинать, но в поисках решения своей проблемы я пока не продвинулся ни на шаг, поэтому пишу...

Некорректное поведение выпадающего меню
Камрады помогите с выпадающим меню - выпадает, но некорректно... &lt;ul class=&quot;menu&quot;&gt; &lt;li&gt;&lt;a...

StringGrid и некорректное поведение CheckBox
Добрый вечер, задача - добавить CheckBox в ячейку StringGrid. Много тем на форуме было по этой теме, получился такой вот код, который и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

Новые блоги и статьи
Облачные приложения на Rust: руководство по архитектуре микросервисов
golander 13.07.2025
Когда я впервые взялся за проектирование облачной платформы для одного из наших клиентов, выбор стоял между привычными Go и Java. Но после нескольких месяцев разработки микросервисной системы,. . .
Как Node.js выполняет асинхронные операции
Reangularity 13.07.2025
Каждый раз, когда я рассказываю про Node. js, возникает один и тот же вопрос: "Как эта штука может быть быстрой, если JavaScript — однопоточный язык?" И это действительно кажется парадоксом. Ведь в. . .
Как писать чистый, тестируемый и качественный код на Python
py-thonny 12.07.2025
Помню свой первый проект на Python. Работал тогда быстро, грязно, лишь бы работало. Код был похож на запутанный клубок - переменные по одной букве, функции на 200 строк, комментарии отсутствовали как. . .
Blazor и контроллер сервопривода IoT Meadow Maple
Wired 11.07.2025
Я решил разобраться, как можно соединить современные веб-технологии с миром "железа". Интересная комбинация получилась из Blazor в качестве веб-интерфейса и микроконтроллера Meadow с его веб-сервером. . .
Генерация OpenQASM из кода Q#
EggHead 10.07.2025
Летом 2024-го я начал эксперименты с библиотекой Q# Bridge, и знаете что? Она оказалась просто находкой для тех, кто работает на стыке разных квантовых экосистем. Основная фишка этой библиотеки -. . .
Изучаем новый шаблон ИИ-чата .NET AI Chat Web App
stackOverflow 10.07.2025
В . NET появилось интересное обновление - новый шаблон ИИ-чата под названием . NET AI Chat Web App. Когда я впервые наткнулся на анонс этого шаблона, то сразу понял, что Microsoft наконец-то. . .
Результаты исследования от команды ARP (июль 2025 г.)
Programma_Boinc 10.07.2025
Результаты исследования от команды ARP (июль 2025 г. ) Африканский проект по дождям (ARP) World Community Grid снова запущен! Мы рады поделиться обновленной информацией о нашем прогрессе с осени. . .
Angular vs Svelte - что лучше?
Reangularity 09.07.2025
Сегодня рынок разделился на несколько четких категорий: тяжеловесы корпоративного уровня (Angular), гибкие универсалы (React), прогрессивные решения (Vue) и новая волна компилируемых фреймворков. . .
Code First и Database First в Entity Framework
UnmanagedCoder 09.07.2025
Entity Framework дает нам свободу выбора, предлагая как Code First, так и Database First подходы. Но эта свобода порождает вечный вопрос — какой подход выбрать? Entity Framework — это. . .
Как использовать Bluetooth-модуль HC-05 с Arduino
Wired 08.07.2025
Bluetooth - это технология, созданная чтобы заменить кабельные соединения. Обычно ее используют для связи небольших устройств: мобильных телефонов, ноутбуков, наушников и т. д. Работает она на частоте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru