Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/25: Рейтинг темы: голосов - 25, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106

Размещение данных в статическом массиве байтов фиксированной размерности с контролем переполнения

19.04.2016, 16:26. Показов 5879. Ответов 55
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. С лабой 3 не могу сообразить.
Разработать две функции, одна из которых вводит с клавиатуры набор данных в произвольной последовательности и размещает в памяти в переменном формате. Другая функция читает эти данные и выводит на экран. Программа запрашивает и размещает в памяти несколько наборов данных при помощи первой функции, а затем читает их и выводит на экран при помощи второй. Размещение данных производить в статическом массиве байтов фиксированной размерности с контролем его переполнения.
Вариант 10
10. Произвольная последовательность строк и целых переменных. Байт со значением 0 - обозначает начало строки (последовательность символов, ограниченная нулем). Байт со значением N является началом последовательности N целых чисел. Конец последовательности - два нулевых байта.
Помогите, пожалуйста!

Добавлено через 23 часа 6 минут
Вот код лабы 3

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
#include <stdio.h>
#include <conio.h>
#define N 100
 
char a[N];
 
void input();
void print();
 
void input()
{
    int i;
    for (i = 0; i <= N; i++)
    {
        printf("Enter string and number: ");
            scanf_s("%s", a[i]);
            if (i == N)
            {
                printf("Array is full.");
            }
    }
}
 
void print()
{
    int i;
    for (i = 0; i <= N; i++)
    {
        printf("%s", a[i]);
    }
}
 
void main()
{
    
    input();
    print();
 
    _getch();
}
Где тут ошибки? И как правильно.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.04.2016, 16:26
Ответы с готовыми решениями:

Реализация удаления по порядковому номеру в статическом стеке размерности 8
Привет всем. Помогите найти ошибку в задаче. Требуется разработать динамическую очередь, тип данных string. Выдает ошибку 'identifer not...

Динамическая матрица с контролем корректности размерности и успешности выделения динамической области памяти
Создать двумерный динамический массив вещественного типа, размерность и содержимое элементов которого задается пользователем с...

Дан произвольный двумерный числовой массив фиксированной размерности
Вариант №20 Дан произвольный двумерный числовой массив фиксированной размерности. . Разработать проект ,позволяющий: 1)Заполнять...

55
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
10.07.2016, 08:03  [ТС]
Студворк — интернет-сервис помощи студентам
Доброго времени суток. Я вот написал с упаковкой последовательности целых чисел в байтовый массив, но она не работает эта самая упаковка. Помогите, пожалуйста.
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <locale.h>
#include <stdlib.h>
 
#define N 20
 
void inputstr(char * A);
void output(char * A);
 
void showMenu()
{
    printf("Меню:\n");
    printf("1. Введите строку\n");
    printf("2. Введите целое число\n");
    printf("0. Завершить ввод\n");
}
 
void main()
{
    char A[N];
    char *p = A;
 
    int i;
 
    setlocale(LC_ALL, "Russian");
 
    inputstr(p);
 
    printf("\nРезультирующая строка: ");
    for (i = 0; i < N && (A[i] || A[i + 1]); i++)
        printf("%c", A[i]);
    printf("\n");
 
    output(p);
 
    _getch();
}
 
void inputstr(char * p)
{
    
    char B[N];
    char *t;
 
    int d;
 
    char ch = 0;
    while (ch != '0')                   // цикл меню
    {
        showMenu();                     // вывод меню на экран
        scanf("%c", &ch);
        switch (ch)
        {
        case '1': // вводим строку
 
            *p = 0; p++;                // вводим ноль, обозначающий начало последовательности символов
 
            printf("Введите строку(англ): ");
            do {                        // проверяет, что в строку не записался символ конца строки
                fgets(B, N, stdin);     // считываем строку с клавиатуры и записываем её во временный массив
            } while (B[0] == '\n');
 
            for (t = B; *t != '\0' && *t != '\n'; p++, t++)
                *p = *t;                // посимвольно переписываем строку B в строку A через указатели
 
            break;
        case '2': // вводим целое число
            int n;
            n = 0;
            *((int*)p)++ = n; p++;  //вводим байт со значением N, обозначающий начало последовательности целых чисел
 
            printf("Введите целое число: ");
            scanf_s("%d", &d);          // считываем число
            *((int*)p)++ = d;
            void pack(char *t, char B[]); // упаковываем последовательность
            
            //_itoa_s(d, B, 10);
                    // преобразуем число в строку, и записываем результат в массив B
 
            for (t = B; *t != '\0' && *t != '\n'; p++, t++)
                *p = *t;                // посимвольно переписываем строку B в строку A через указатели
 
            break;
        case '0':// выход из программы
            *p = 0; p++;    // записываем в строку последовательность, обозначающую конец последовательности A
            *p = 0; p++;
            break;
        default:
            break;
        }
    }
}
 
void output(char * p)
{
    
    //char B[10];
    //char *t = B;
 
    while (*p || *(p + 1))  // продолжать распаковку строки, пока не будет достигнута последовательность 00
    {
        switch (*p)
        {
        case '0': // выводим строку
            p++;                        // переместимся на следующий элемент массива символов
            int unpack(char *p, char A[]); // распаковываем последовательность
 
            printf("\nБыла введена последовательность: ");
            for (; *p != 0; p++)
                printf("%c", *p);               // посимвольно выводим строку
            
 
            break;
        /*case 'N': // выводим целое число
            p++;
 
            // переписываем число из строки A в отдельный массив посимвольно
            for (; *p != 0 && *p != 'N'; p++, t++)
                *t = *p;
 
            printf("\nБыло введено число: %d", B);      // переводим считанные символы в число и выводим число на экран
 
            break;*/
        default:
            break;
        }
    }
}
 
 
void pack(char *t, char B[])
{
    char *pcnt = t++; // указатель на последний счетчик
    *pcnt = 0; int i;
    for (i = 0; i < N; i++)
    {
        // смена счетчика
        if (i != 0 && (B[i] == 0 && B[i - 1] != 0) || B[i] != 0 && B[i - 1] == 0)
        {
            pcnt = t++; *pcnt = 0;
        }
        if (B[i] == 0)
            (*pcnt)--; // -1 к счетчику нулевых
        else
        {
            (*pcnt)++; // +1 к счетчику ненулевых
            *((int*)t)++ = B[i]; 
        }
        *t++ = 0;
    }
}
 
int unpack(char *p, char A[])
{
    int i = 0, cnt;
    while ((cnt = *p++) != 0) // Пока нет нулевого счетчика
    {
        if (cnt < 0)
            while (cnt++ != 0)
                A[i++] = 0;
        else
            while (cnt-- != 0)
                A[i++] = *((int*)p)++; // извлечь с преобразованием типа указателя
    }
    return i;
}
https://www.cyberforum.ru/atta... 1468126928
Миниатюры
Размещение данных в статическом массиве байтов фиксированной размерности с контролем переполнения  
0
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
11.07.2016, 18:02  [ТС]
Вот другой вариант, но он тоже не работает.
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
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <locale.h>
#include <stdlib.h>
 
#define N 20
 
void inputstr(char * A);
void output(char * A);
 
void showMenu()
{
    printf("Меню:\n");
    printf("1. Введите строку\n");
    printf("2. Введите целое число\n");
    printf("0. Завершить ввод\n");
}
 
void main()
{
    char A[N];
    char *p = A;
 
    int i;
 
    setlocale(LC_ALL, "Russian");
 
    inputstr(p);
 
    printf("\nРезультирующая строка: ");
    for (i = 0; i < N && (A[i] || A[i + 1]); i++)
        printf("%c", A[i]);
    printf("\n");
 
    output(p);
 
    _getch();
}
 
void inputstr(char * p)
{
    
    char B[N];
    char *t;
 
    int d;
 
    char ch = 0;
    while (ch != '0')                   // цикл меню
    {
        showMenu();                     // вывод меню на экран
        scanf("%c", &ch);
        switch (ch)
        {
        case '1': // вводим строку
 
            *p = 0; p++;                // вводим ноль, обозначающий начало последовательности символов
 
            printf("Введите строку(англ): ");
            do {                        // проверяет, что в строку не записался символ конца строки
                fgets(B, N, stdin);     // считываем строку с клавиатуры и записываем её во временный массив
            } while (B[0] == '\n');
 
            for (t = B; *t != '\0' && *t != '\n'; p++, t++)
                *p = *t;                // посимвольно переписываем строку B в строку A через указатели
 
            break;
        case '2': // вводим целое число
            int n;
            n = (int*)p; p[N] = 0;
             n++; p++;  //вводим байт со значением N, обозначающий начало последовательности целых чисел
 
            printf("Введите целое число: ");
            scanf_s("%d", &d);          // считываем число
             d = (int*)p;
            //void pack(char *t, char B[]); // упаковываем последовательность
            
            //_itoa_s(d, B, 10);
                    // преобразуем число в строку, и записываем результат в массив B
 
            for (t = B; *t != '\0' && *t != '\n'; p++, t++)
                *p = *t;                // посимвольно переписываем строку B в строку A через указатели
 
            break;
        case '0':// выход из программы
            *p = 0; p++;    // записываем в строку последовательность, обозначающую конец последовательности A
            *p = 0; p++;
            break;
        default:
            break;
        }
    }
}
 
void output(char * p)
{
    
    //char B[10];
    //char *t = B;
 
    while (*p || *(p + 1))  // продолжать распаковку строки, пока не будет достигнута последовательность 00
    {
        switch (*p)
        {
        case '0': // выводим строку
            p++;                        // переместимся на следующий элемент массива символов
            //int unpack(char *p, char A[]); // распаковываем последовательность
 
            printf("\nБыла введена последовательность: ");
            for (; *p != 0; p++)
                printf("%c", *p);               // посимвольно выводим последовательность
            
 
            break;
        /*case 'N': // выводим целое число
            p++;
 
            // переписываем число из строки A в отдельный массив посимвольно
            for (; *p != 0 && *p != 'N'; p++, t++)
                *t = *p;
 
            printf("\nБыло введено число: %d", B);      // переводим считанные символы в число и выводим число на экран
 
            break;*/
        default:
            break;
        }
    }
}
https://www.cyberforum.ru/atta... 1468249248
Помогите, пожалуйста.
Миниатюры
Размещение данных в статическом массиве байтов фиксированной размерности с контролем переполнения  
0
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
11.07.2016, 18:32  [ТС]
Вот ещё вариант. Так же работает, как и предыдущий.
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
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <locale.h>
#include <stdlib.h>
 
#define N 20
 
void inputstr(char * A);
void output(char * A);
 
void showMenu()
{
    printf("Меню:\n");
    printf("1. Введите строку\n");
    printf("2. Введите целое число\n");
    printf("0. Завершить ввод\n");
}
 
void main()
{
    char A[N];
    char *p = A;
 
    int i;
 
    setlocale(LC_ALL, "Russian");
 
    inputstr(p);
 
    printf("\nРезультирующая строка: ");
    for (i = 0; i < N && (A[i] || A[i + 1]); i++)
        printf("%c", A[i]);
    printf("\n");
 
    output(p);
 
    _getch();
}
 
void inputstr(char * p)
{
    
    char B[N];
    char *t;
 
    int d;
 
    char ch = 0;
    while (ch != '0')                   // цикл меню
    {
        showMenu();                     // вывод меню на экран
        scanf("%c", &ch);
        switch (ch)
        {
        case '1': // вводим строку
 
            *p = 0; p++;                // вводим ноль, обозначающий начало последовательности символов
 
            printf("Введите строку(англ): ");
            do {                        // проверяет, что в строку не записался символ конца строки
                fgets(B, N, stdin);     // считываем строку с клавиатуры и записываем её во временный массив
            } while (B[0] == '\n');
 
            for (t = B; *t != '\0' && *t != '\n'; p++, t++)
                *p = *t;                // посимвольно переписываем строку B в строку A через указатели
 
            break;
        case '2': // вводим целое число
            int n;
            n = *((int*)p)++; p[N] = 0;
             n++; p++;  //вводим байт со значением N, обозначающий начало последовательности целых чисел
 
            printf("Введите целое число: ");
            scanf_s("%d", &d);          // считываем число
             d = *((int*)p)++;
            //void pack(char *t, char B[]); // упаковываем последовательность
            
            //_itoa_s(d, B, 10);
                    // преобразуем число в строку, и записываем результат в массив B
 
            for (t = B; *t != '\0' && *t != '\n'; p++, t++)
                *p = *t;                // посимвольно переписываем строку B в строку A через указатели
 
            break;
        case '0':// выход из программы
            *p = 0; p++;    // записываем в строку последовательность, обозначающую конец последовательности A
            *p = 0; p++;
            break;
        default:
            break;
        }
    }
}
 
void output(char * p)
{
    
    //char B[10];
    //char *t = B;
 
    while (*p || *(p + 1))  // продолжать распаковку строки, пока не будет достигнута последовательность 00
    {
        switch (*p)
        {
        case '0': // выводим строку
            p++;                        // переместимся на следующий элемент массива символов
            //int unpack(char *p, char A[]); // распаковываем последовательность
 
            printf("\nБыла введена последовательность: ");
            for (; *p != 0; p++)
                printf("%c", *p);               // посимвольно выводим последовательность
            
 
            break;
        /*case 'N': // выводим целое число
            p++;
 
            // переписываем число из строки A в отдельный массив посимвольно
            for (; *p != 0 && *p != 'N'; p++, t++)
                *t = *p;
 
            printf("\nБыло введено число: %d", B);      // переводим считанные символы в число и выводим число на экран
 
            break;*/
        default:
            break;
        }
    }
}
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
12.07.2016, 11:11
Когда вы уже в толк возьмете, что ну не имеет задача решения в ваших кривых условиях..
0
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
12.07.2016, 17:17  [ТС]
Решение есть с преобразованием типа указателя. Почитайте лекции Евгения Леонидовича Романова по Си. http://ermak.cs.nstu.ru/cprog/HTML/index.htm
Я просто не до конца понимаю.
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
12.07.2016, 20:04
Цитата Сообщение от alexlarichkin5 Посмотреть сообщение
Решение есть с преобразованием типа указателя
Ага, ну-ну. Когда с помощью преобразований разрулите логический косяк из
Цитата Сообщение от alexlarichkin5 Посмотреть сообщение
0 - обозначает начало строки (последовательность символов, ограниченная нулем)
и
Цитата Сообщение от alexlarichkin5 Посмотреть сообщение
Конец последовательности - два нулевых байта
расскажите. А то забавно выходит

Code
1
2
3
4
5
6
7
8
9
bytes in buffer
--------------------------------------------------
0 q w e r t y 0 0 a b c d e f 0 0
--------------------------------------------------
              ^ ^
              | |
        +-----+ +-----+
        |             |
 end of string1     start of string2
Уупс, конец последовательности посреди данных, ай-яй-яй.
1
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
13.07.2016, 04:18  [ТС]
Разрулил косяк, только с упаковкой чисел не получается.
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
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <locale.h>
#include <stdlib.h>
 
#define N 20
 
void inputstr(char * A);
void output(char * A);
 
void showMenu()
{
    printf("Меню:\n");
    printf("1. Введите строку\n");
    printf("2. Введите последовательность целых чисел\n");
    printf("0. Завершить ввод\n");
}
 
void main()
{
    char A[N];
    char *p = A;
 
    int i;
 
    setlocale(LC_ALL, "Russian");
 
    inputstr(p);
 
    printf("\nРезультирующая строка: ");
    for (i = 0; i < N && (A[i] || A[i + 1]); i++)
        printf("%c", A[i]);
    printf("\n");
 
    output(p);
 
    _getch();
}
 
void inputstr(char * p)
{
    
    char B[N];
    char *t;
 
    int d, n;
 
    char ch = 0;
    while (ch != '0')                   // цикл меню
    {
        showMenu();                     // вывод меню на экран
        scanf("%c", &ch);
        switch (ch)
        {
        case '1': // вводим строку
 
            *p = 0; p++;                // вводим ноль, обозначающий начало последовательности символов
 
            printf("Введите строку(англ): ");
            do {                        // проверяет, что в строку не записался символ конца строки
                fgets(B, N, stdin);     // считываем строку с клавиатуры и записываем её во временный массив
            } while (B[0] == '\n');
 
            for (t = B; *t != '\0' && *t != '\n'; p++, t++)
                *p = *t;                // посимвольно переписываем строку B в строку A через указатели
 
            break;
        case '2': // вводим целое число
            
            for(n = 0; n < N; n++)
            {
                printf("Введите целое число: ");
                scanf_s("%d", &d);          // считываем число
                *((int*)p)++ = d;
                
            }
            *((int*)p)++ = n; p++;  //вводим байт со значением N, обозначающий начало последовательности целых чисел
 
            
            //void pack(char *t, char B[]); // упаковываем последовательность
            
            //_itoa_s(d, B, 10);
                    // преобразуем число в строку, и записываем результат в массив B
 
            for (t = B; *t != '\0' && *t != '\n'; p++, t++)
                *p = *t;                // посимвольно переписываем строку B в строку A через указатели
 
            break;
        case '0':// выход из программы
            *p = 0; p++;    // записываем в строку последовательность, обозначающую конец последовательности A
            *p = 0; p++;
            break;
        default:
            break;
        }
    }
}
 
void output(char * p)
{
    
    //char B[10];
    //char *t = B;
 
    while (*p || *(p + 1))  // продолжать распаковку строки, пока не будет достигнута последовательность 00
    {
        switch (*p)
        {
        case '0': // выводим строку
            p++;                        // переместимся на следующий элемент массива символов
            //int unpack(char *p, char A[]); // распаковываем последовательность
 
            printf("\nБыла введена последовательность: ");
            for (; *p != 0; p++)
                printf("%c", *p);               // посимвольно выводим последовательность
            
 
            break;
        /*case 'N': // выводим целое число
            p++;
 
            // переписываем число из строки A в отдельный массив посимвольно
            for (; *p != 0 && *p != 'N'; p++, t++)
                *t = *p;
 
            printf("\nБыло введено число: %d", B);      // переводим считанные символы в число и выводим число на экран
 
            break;*/
        default:
            break;
        }
    }
}
https://www.cyberforum.ru/atta... 1468372622
Миниатюры
Размещение данных в статическом массиве байтов фиксированной размерности с контролем переполнения  
0
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
01.08.2016, 16:31  [ТС]
Доброго времени суток. Вот рисунок какой должна быть последовательность.
https://www.cyberforum.ru/atta... 1470057909
Я не пойму как запрогать байт со значением N, обозначающий начало последовательности целых чисел. Не разберу, где ошибки в функции ввода. Ещё не работает функция вывода.
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
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <locale.h>
#include <stdlib.h>
 
#define N 100
 
void inputstr(char * A);
void output(char * A);
 
 char A[N];
 
 char *gcp_lastError = NULL; // строка сообщений об ошибках
 
void showMenu()
{
    printf("Меню:\n");
    printf("1. Введите строку\n");
    printf("2. Введите последовательность целых чисел\n");
    printf("0. Завершить ввод\n");
}
 
void showSubMenu()
{
    printf("1. Введите числа\n");
    printf("R.Выход в меню\n");
}
 
void main()
{
    
    char *p = A;
 
    //int i;
 
    setlocale(LC_ALL, "Russian");
 
    inputstr(p);
 
    /*printf("\nРезультирующая строка: ");
    for (i = 0; i < N && (A[i] || A[i + 1]); i++)
        printf("%c", A[i]);*/
    printf("\n");
 
    output(p);
 
    _getch();
}
 
void inputstr(char * p)
{
    
    int d, n = 0;
 
    char ch = 0;
    while (ch != '0')                   // цикл меню
    {
        showMenu();                     // вывод меню на экран
        scanf("%c", &ch);
        switch (ch)
        {
        case '1': // вводим строку
 
            *p = 0; p++;                // вводим ноль, обозначающий начало последовательности символов
 
            printf("Введите строку(англ): ");
            do {                        // проверяет, что в строку не записался символ конца строки
                fgets(A, N, stdin);     // считываем строку с клавиатуры и записываем её в массив
            } while (A[0] == '\n');
 
            //for (t = B; *t != '\0' && *t != '\n'; p++, t++)
                //*p = *t;              // посимвольно переписываем строку B в строку A через указатели
 
            break;
        case '2': // вводим целое число
            *p = n; p++;    //вводим байт со значением N, обозначающий начало последовательности целых чисел
            showSubMenu();
            switch (_getch())
            {
            case '1':
                printf("Введите целые числа: ");
                for (; *p < N; *p++)
                {
                    scanf_s("%d", &d);
                    *((int*)p)++ = d;
                    n++;
            case 'R':
                break;
                }
 
            default:
                break;
            }
 
            if(*p == N) // предупреждение о заполнении массива
            {
                gcp_lastError = "Ошибка! Массив заполнен!(inputstr)";
            }
        
            break;
        case '0':// выход из программы
            *p = 0; p++;    // записываем в строку последовательность, обозначающую конец последовательности A
            *p = 0; p++;
            break;
        default:
            break;
        }
    }
}
 
void output(char * p)
{
    
    while (*p || *(p + 1))  // продолжать распаковку строки, пока не будет достигнута последовательность 00
    {
        switch (*p)
        {
        case '0': // выводим строку
            p++;                        // переместимся на следующий элемент массива символов
 
            printf("\nБыла введена последовательность: ");
            for (; *p < N; p++)
                printf("%c", *p);
                A[*p++] = *((int*)p)++;
                printf("%d", A[*p]);                // выводим последовательность
            
            break;
                default:
            break;
        }
    }
}
Помогите, пожалуйста.
Миниатюры
Размещение данных в статическом массиве байтов фиксированной размерности с контролем переполнения  
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
01.08.2016, 18:55
Цитата Сообщение от alexlarichkin5 Посмотреть сообщение
Не разберу, где ошибки в функции ввода. Ещё не работает функция вывода
Потому что у вас ошибка в понимании процесса. Ну хотя бы вы начали рисовать. Вот смотрите: у вас ячейка №1 где нолик, и ячейка №4 где ноль-терминатор конца строки.

Вопрос №1: почему вы их сделали разным цветом, если значение там одно и то же (ноль-терминатор \0 есть 0)?

Вопрос №2: как при такой схеме-раскраске вы видите расположение двух строк в буфере подряд?
0
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
02.08.2016, 03:26  [ТС]
Этот рисунок сделал не я, а преподаватель.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
03.08.2016, 01:05

Не по теме:

alexlarichkin5, 4 месяца почти бьётесь. Это впечатляет!


Цитата Сообщение от alexlarichkin5 Посмотреть сообщение
Конец последовательности - два нулевых байта.
Вот это абсолютно лишнее - смещение по количеству чисел легко определяется.
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
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <limits.h>
 
#define CHUNK_SIZE 100
 
void flush_input(void) {
    char c;
    while (scanf("%c", &c) == 1 && c != '\n')
        ;
}
 
int main(void) {
    char chunk[CHUNK_SIZE], *chunkPtr = chunk;
    int menuAction, done = 0;
 
    while (!done) {
        printf("\n[0 = help]> ");
        if (scanf("%d", &menuAction) != 1) {
            fprintf(stderr, "Wrong input!\n");
            return 1;
        }
        flush_input();
        switch (menuAction) {
        case 0:
            printf("0 - this help\n"
                "1 - add string\n"
                "2 - add numbers\n"
                "3 - dump chunk\n"
                "4 - exit\n"
            );
            break;
        case 1: {
            char buf[BUFSIZ], *tailPtr;
 
            printf("String: ");
            if (!fgets(buf, BUFSIZ, stdin) || *buf == '\n') {
                fprintf(stderr, "Wrong input!\n");
                return 1;
            }
            if ((tailPtr = strrchr(buf, '\n')) != NULL)
                *tailPtr = '\0';
            if ((int)(strlen(buf) + 2) > CHUNK_SIZE + chunk - chunkPtr)
                printf("Not enough space in chunk!\n");
            else {
                *chunkPtr++ = 0;
                strcpy(chunkPtr, buf);
                chunkPtr += strlen(buf) + 1;
                printf("Ok.\n");
            }
            break;
        }
        case 2: {
            char numbersCount;
 
            printf("How many numbers (MAX. %d): ", CHAR_MAX);
            if (scanf("%hhd", &numbersCount) != 1 || numbersCount < 1) {
                fprintf(stderr, "Wrong input!\n");
                return 1;
            }
            if ((int)(sizeof(int) * numbersCount + 1) > CHUNK_SIZE + chunk - chunkPtr)
                printf("Not enough space in chunk!\n");
            else {
                int * numPtr = (int*)(chunkPtr + 1);
                *chunkPtr = numbersCount;
                chunkPtr += sizeof(int) * numbersCount + 1;
                while (numbersCount--) {
                    printf("Number (%hhd left): ", numbersCount);
                    if (scanf("%d", numPtr++) != 1) {
                        fprintf(stderr, "Wrong input!\n");
                        return 1;
                    }
                }
                printf("Ok.\n");
            }
            break;
        }
        case 3: {
            if (chunkPtr == chunk)
                printf("The chunk is empty.\n");
            else {
                char * readPtr = chunk;
                while (readPtr < chunkPtr) {
                    if (*readPtr == 0) {
                        printf("%s ", readPtr + 1);
                        readPtr += strlen(readPtr + 1) + 2;
                    }
                    else {
                        char numbersCount = *readPtr;
                        int * numPtr = (int*)(readPtr + 1);
                        readPtr += sizeof(int) * numbersCount + 1;
                        while (numbersCount--)
                            printf("%d ", *numPtr++);
                    }
                }
                printf("\nOk.\n");
            }
            break;
        }
        case 4:
            done = 1;
            printf("Coodbye!\n");
            break;
        default:
            printf("Wrong choice, try enter 0.\n");
            break;
        }
    }
 
    return 0;
}
0
0 / 0 / 1
Регистрация: 05.03.2016
Сообщений: 106
03.08.2016, 03:19  [ТС]
По условию задачи данные нужно упаковать в статический байтовый массив. Пожалуйста, внимательнее посмотрите условие задачи и мой код. Мне нужно правильно написать функции ввода и вывода.
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
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <locale.h>
#include <stdlib.h>
 
#define N 100
 
void inputstr(char * A);
void output(char * A);
 
 char A[N];
 
 char *gcp_lastError = NULL; // строка сообщений об ошибках
 
void showMenu()
{
    printf("Меню:\n");
    printf("1. Введите строку\n");
    printf("2. Введите последовательность целых чисел\n");
    printf("0. Завершить ввод\n");
}
 
void showSubMenu()
{
    printf("1. Введите числа\n");
    printf("R.Выход в меню\n");
}
 
void main()
{
    
    char *p = A;
 
    //int i;
 
    setlocale(LC_ALL, "Russian");
 
    inputstr(p);
 
    /*printf("\nРезультирующая строка: ");
    for (i = 0; i < N && (A[i] || A[i + 1]); i++)
        printf("%c", A[i]);*/
    printf("\n");
 
    output(p);
 
    _getch();
}
 
void inputstr(char * p)
{
    
    int d, n = 0;
 
    char ch = 0;
    while (ch != '0')                   // цикл меню
    {
        showMenu();                     // вывод меню на экран
        scanf("%c", &ch);
        switch (ch)
        {
        case '1': // вводим строку
 
            *p = 0; p++;                // вводим ноль, обозначающий начало последовательности символов
 
            printf("Введите строку(англ): ");
            do {                        // проверяет, что в строку не записался символ конца строки
                fgets(A, N, stdin);     // считываем строку с клавиатуры и записываем её в массив
            } while (A[0] == '\n');
 
            //for (t = B; *t != '\0' && *t != '\n'; p++, t++)
                //*p = *t;              // посимвольно переписываем строку B в строку A через указатели
 
            break;
        case '2': // вводим целое число
            char *t;
            int i = 0;
            t = &A[i];
            p++;    //вводим байт со значением N, обозначающий начало последовательности целых чисел
            showSubMenu();
            switch (_getch())
            {
            case '1':
                printf("Введите целые числа: ");
                while(*p != 0)
                {
                    scanf_s("%d", &d);
                    *((int*)p)++ = d;
                    n++;
                    A[i] = n;
                    p++;
            case 'R':
                break;
                }
            }
 
            if(*p == N) // предупреждение о заполнении массива
            {
                gcp_lastError = "Ошибка! Массив заполнен!(inputstr)";
            }
        
            break;
        case '0':// выход из программы
            *p = 0; p++;    // записываем в строку последовательность, обозначающую конец последовательности A
            *p = 0; p++;
            break;
        default:
            break;
        }
    }
}
 
void output(char * p)
{
    
    while (*p || *(p + 1))  // продолжать распаковку строки, пока не будет достигнута последовательность 00
    {
        switch (*p)
        {
        case '0': // выводим строку
            p++;                        // переместимся на следующий элемент массива символов
 
            printf("\nБыла введена последовательность: ");
            for (; *p < N; p++)
                printf("%c", *p);
                A[*p++] = *((int*)p)++;
                printf("%d", A[*p]);                // выводим последовательность
            
            break;
                default:
            break;
        }
    }
}
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
03.08.2016, 09:31
Цитата Сообщение от easybudda Посмотреть сообщение
Вот это абсолютно лишнее - смещение по количеству чисел легко определяется.
Там не то имеется ввиду. Эти два нуля обозначают конец вообще всей мешанины в буфере. А вообще, да, чушь ибо не сказано как это должно выглядеть например если в буфере строка лежит последней.
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
03.08.2016, 11:40
HighPredator, какое приятно нечеткое тз
На самом деле я думаю тут нужно смотреть парность нулей.
Т.е. вариант, когда идут две строки подряд будет выглядеть так:
Code
1
2
3
4
0x00 0x54 0x65 0x73 0x74 0x20 0x73 0x74 0x72 0x69 0x6E 0x67 0x21 0x00 0x00 0x2A ...
  ^^  T    e    s    t    ^    s    t    r    i    n    g    !     ^^   ^^
  ||                      |                                        ||   ||
string start            space                              string end   string start
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
03.08.2016, 11:53
HighPredator, разве? Я так понял - после каждой последовательности чисел по два нулевых байта должны вставляться. Хотя от них и в хвосте всего массива толка не прибавится. В любом случае я всё не так сделал - и массив из майн не вынес, и вставку/чтение в отдельные функции не оформил... Короче, двойка мне за это задание. Не буду мешать. Ещё месяц - другой, и сам справится.
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
03.08.2016, 12:59
alexlarichkin5, вот тебе парсер этого формата, заполнение сам напишешь - это проще
Кликните здесь для просмотра всего текста

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
#include <string.h>
#include <stdio.h>
 
char const * get_string(char const * buf, size_t len)
{
    char const * p;
 
    p = memchr(buf, 0, len);
    if(p)
    {
        printf("string: [%s]\n", buf);
        ++p;
    }
    return p;
}
 
char const * get_numbers(size_t count, char const * buf, size_t len)
{
    size_t offset;
    char const * p = NULL;
 
    offset = count * sizeof(int);
    if(offset + 2 <= len)
    {
        if(!buf[offset + 0] && !buf[offset + 1])
        {
            size_t i;
 
            p = buf + offset + 2;
            for(i = 0; i < offset; i += sizeof(int))
            {
                int num;
                memcpy(&num, buf + i, sizeof(int));
                printf("number: [%d]\n", num);
            }
        }
    }
    return p;
}
 
void parse(char const * buf, size_t len)
{
    while(len > 0)
    {
        unsigned val;
        char const * p;
 
        val = (--len, *buf++);
 
        p = val ? get_numbers(val, buf, len) : get_string(buf, len);
        if(p)
        {
            len -= p - buf;
            buf  = p;
        }
        else
        {
            printf("Format error!\n");
            break;
        }
    }
}
 
char buffer[] =
    "\0hello world!\0"
    "\0test string!\0"
    "\x02\x01\x00\x00\x00"
        "\x02\x00\x00\x00"
        "\x00\x00"
    "\x01\x20\x00\x00\x00"
        "\x00";
 
int main()
{
    parse(buffer, sizeof(buffer));
 
    return 0;
}
http://rextester.com/KSCK12307
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
03.08.2016, 13:21
Цитата Сообщение от alexlarichkin5 Посмотреть сообщение
scanf_s("%s", A);
C++
1
scanf_s("%s", &A)
в 64 строке, попробуйте
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
03.08.2016, 13:35
Цитата Сообщение от DrOffset Посмотреть сообщение
На самом деле я думаю тут нужно смотреть парность нулей.
Т.е. вариант, когда идут две строки подряд будет выглядеть так:
Да меня с самого начала от этого задания бомбит)) Что-то не понял про парность? Типа один ноль между двумя подряд идущими строками? Одновременно хвост и начало?
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
03.08.2016, 13:39
Цитата Сообщение от HighPredator Посмотреть сообщение
Одновременно хвост и начало?
Не, у кажой строки - два нуля.
Начальный ноль, который определяет, что это строка и звершающий, который определяет ее конец.
Если следом идет еще строка, то после завершающего нуля будет еще один - ведущий от этой новой строки.
Таким образом получается, что если две строки идут подряд, то последовательность будет такая
<0>строка 1<0><0>строка 2<0>
Я этот принцип реализовал в коде выше.
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
03.08.2016, 13:48
DrOffset, понял. Я в код еще пока полностью не вчитывался, верно я понял что у вас в коде идея не в наличии терминирующей последовательности всех данных в буфере а в хранении длины?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.08.2016, 13:48

Как создать в файле массив указателей фиксированной размерности на строки текста?
подскажите пожалуйста! есть работающая программа, но реализована она неправильно и я не знаю как сделать правильно..(я уже пыталась ее...

Стек на статическом массиве
Может кто-нибудь написать стек на статическом массиве. Т.е чтобы был объявлен массив, объявлен указатель на дно стека, проверка на то, что...

Мусор в строковом статическом массиве C++
Если строковый статический массив заполнить \0, а потом вводить символы, количество которых &lt; количество элементов массива, то...

Односвязнай список на статическом массиве
В общем, застряла. Задание звучит так: Элементы ОЛС находятся в массиве MemList, расположенном в статической памяти. Базовый тип...

Роутер с временным контролем (родительским контролем)
Приветствую, возникла острая необходимость в роутере в котором присутствует нормальный родительский контроль. Очень важно, чтобы он умел...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru