Преобразование типов указателей - C (СИ)
Формулировка задачи:
Помогите найти ошибку в коде лабораторной работы по Си.
Дано задание:
Разработать две функции, одна из которых вводит с клавиатуры набор данных в произвольной последовательности и размещает в памяти в переменном формате. Другая функция читает эти данные и выводит на экран. Программа запрашивает и размещает в памяти несколько наборов данных при помощи первой функции, а затем читает их и выводит на экран при помощи второй. Размещение данных производить в статическом массиве байтов фиксированной размерности с контролем его переполнения.
Упакованная строка, содержащая символьное представление целых чисел. Все символы строки, кроме цифр, помещаются в последовательность в исходном виде. Последовательность цифр преобразуется в целую переменную, которая записывается в упакованную строку, предваренная символом \0. Конец строки - два подряд идущих символа \0. Пример:
-исходная строка: "aa2456bbbb6665"
-упакованная строка: 'a' 'a' '\0' 2456 'b' 'b' 'b' 'b' '\0' 6665 '\0' '\0'
Программа выполняет указанные операции, но в момент смены типа указателя я чтото делаю неверно, в результате число в упакованной строке записывается или извлекается неверно.
Вот код:
#include <stdio.h> #include <conio.h> char packstr[100]; // строка, в которую будем упаковывать char* ptr; // указатель, который ходит по строке int* tmp; void getStr(char*); void strPack(char*); void Print(char*); void main() { char string[100]; clrscr(); getStr(string); strPack(string); Print(packstr); printf("\n\n\n\nKontrol': %s", packstr); getch(); } void getStr(char * str) { printf("Vvedite stroku:\n"); gets(str); } void strPack(char * str) { int i; int num = 0; ptr=&packstr[0]; for(i=0; i<100; i++) { packstr[i]=49; } while(*ptr!=0&&*str!=0) { if(*str<58&&*str>47) { while(*str<58&&*str>47) { num *= 10; num += *str - '0'; str++; } printf("Rezultat preobrazovaniya: %d\n",num); *ptr='\\0'; ptr++; //указатель делает шаг вправо по упакованной строке tmp=(int*)ptr; //преобразовываем тип указателя *tmp=num; //помещаем в упакованную строку интовое значение ptr=(char*)tmp; ptr++; //указатель делает шаг вправо по упакованной строке } else { num = 0; *ptr=*str; ptr++; //указатель делает шаг вправо по упакованной строке str++; //указатель делает шаг вправо по исходной строке } } if(*str++==0) { *ptr++='\\0'; *ptr++='\\0'; } } void Print(char* str) { int i; printf("Upakovannaya stroka: "); for(i=0;i<100;i++) { if(*str=='\\0') { printf("%c",*str); str++; if(*str=='\\0') {return;} else { tmp=(int*)str; //преобразовываем тип указателя printf("%d",*tmp); //печатаем на экран str++; //указатель делает шаг вправо по упакованной строке } } else { printf("%c",*str); //печатаем на экран str++; } } }
Решение задачи: «Преобразование типов указателей»
textual
Листинг программы
*ptr='\\0'; memcpy(ptr+1, &num, sizeof(int)); ptr+=sizeof(int)+1;
Объяснение кода листинга программы
В данном коде происходит преобразование типов указателей и копирование значения переменной num
в память, на которую указывает переменная ptr
.
- Переменная
ptr
инициализируется значением '\0'. - Далее, с помощью функции
memcpy
, значение переменнойnum
копируется в память, начиная с адреса, на который указывает переменнаяptr+1
. - Значение переменной
ptr
увеличивается на размер переменнойint
(4 байта) плюс 1.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д