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

  1. Переменная ptr инициализируется значением '\0'.
  2. Далее, с помощью функции memcpy, значение переменной num копируется в память, начиная с адреса, на который указывает переменная ptr+1.
  3. Значение переменной ptr увеличивается на размер переменной int (4 байта) плюс 1.

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


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

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

6   голосов , оценка 4.667 из 5