Преобразование типов указателей - 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.