Преобразуйте указатель типа int в указатель на символ, если значения int гарантированно меньше 256 в C - PullRequest
1 голос
/ 15 апреля 2019

У меня есть int*:

int arr[4];
int *x = arr;
x[0] = 65;
x[1] = 66;
x[2] = 67;
x[3] = 0; // terminating null

Затем я хочу напечатать эти значения в виде символов:

char *y = magical_function(x);
printf(y);

Вывод должен быть ABC. Как мне получить или определить эту магическую функцию?

Примечание: если мне довелось получить это: x[2] = 1000;, тогда мне, честно говоря, все равно, что делает ответ. Он может игнорировать старшие биты, ошибки, что угодно, в данном случае это UB.

Это не работает:

char *y = (char*) x;

... поскольку выходные данные просто A, вероятно, поскольку char* интерпретирует int как 4 символа, а 2-й из этих символов является нулевым байтом, который завершает строку:

int arr[4];
int *x = arr;
// x points to the following memory:

 x->01000000 (x[0])
    00000000
    00000000
    00000000 (65)
    -------- (x[1])
    01000001
    00000000
    00000000
    00000000 (66)
// if casted to a char*:

y->01000000 "A"
   00000000 "\0"
   00000000 "\0"
   00000000 "\0" etc.

Ответы [ 4 ]

2 голосов
/ 15 апреля 2019

int и char, вероятно, имеют разные размеры, поэтому вы не можете просто привести указатели, так как они будут прочитаны / записаны неправильно. Если у вас есть массив целых чисел и вам нужен массив другого типа, будь то char, float или просто целое число другого размера, вам нужно создать новый массив и преобразовать каждый элемент.

/*magical_function*/
/*Assuming arr is "null terminated". Don't forget to call free().*/
char *int_to_char_array(int *arr)
{
    size_t len = 0;
    int *p = arr;
    do {
        ++len;
    }  while (*p++);
    char *out = malloc(len); // Allocate space needed for same number of chars
    for (size_t i = 0; i < len; ++i)
        out[i] = (char)arr[i]; // convert each element
    return out;
}
int main() {
    // As in OP
    int arr[4];
    int *x = arr;
    x[0] = 65;
    x[1] = 66;
    x[2] = 67;
    x[3] = 0; // terminating null

    char *str = int_to_char_array(arr);
    printf("%s\n", str); // or any normal string function
    printf("length %i\n", strlen(str));
    free(str);
}

Демонстрационная версия: http://tpcg.io/fPETPE

1 голос
/ 15 апреля 2019

Следующий код основан на том, что является 0 последним элементом на входе.

#include <stdio.h>
#include <stdlib.h>

char *
magical_function (int const *x) {
    size_t numOfElements = 0;
    size_t i = 0;
    for (i = 0; x[i] != 0 ; ++i, ++numOfElements) ;
    char *p = malloc(numOfElements + 1);
    if (!p) {
        perror("malloc error");
        exit(EXIT_FAILURE);
    }

    for (i = 0; i < numOfElements; ++i) {
        p[i] = (char)x[i];
    }
    p[i] = 0;
    return p;
}

int
main (void) {
    int arr[4];
    int * const x = arr;

    x[0] = 65;
    x[1] = 66;
    x[2] = 67;
    x[3] = 0;

    char *y = magical_function(x);
    puts(y);
    free(y);

    return 0;
}
1 голос
/ 15 апреля 2019

Я хочу напечатать эти значения в виде символов ... Вывод должен быть ABC. Как мне получить или определить эту магическую функцию?

Он называется printf, а его определение находится в stdio.h. Подробнее здесь: http://www.cplusplus.com/reference/cstdio/printf/

#include <stdio.h>

int main()
{

    int arr[4] = {65, 66, 67, 0};

    for(int i = 0; i < 4; i++) printf("%c", arr[i]);

    return 0;

}

Проверенный код здесь: http://tpcg.io/AFwhXt

1 голос
/ 15 апреля 2019

В этом случае я бы просто изменил спецификатор формата на% c

, например:

int a = 65;
printf("%c\n", a);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...