ошибка преобразования const char * в char - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь преобразовать одну переменную char в переменную const char, но у меня есть ошибка ниже. С содержимым переменной char все в порядке, в данном случае это «H» и «e», но когда я конвертирую в const char *, у меня есть буква + что-то еще после. Ребята, скажите, пожалуйста, где я сделал что-то не так?

Пожалуйста, смотрите изображение по ссылке!

#include <iostream>
#include <Windows.h>
#include <lmcons.h>
#include <stdio.h>
#include <stdlib.h>

    char Body[] = { 'H', 'e', 'l', 'l', 'o' };       // elements of char array


    int size = sizeof(Body);                          // get size of Body array
    char Line;

    std::cout << "Size : " << size << "\n";           // view the size of Body array

    for(int i=0; i<=size; i++)                        // for statement : from first element to the last element of array
    {                                                 // beginning  of for statement

    Line = Body[i];                                   // get each element from Body array and put to char variable

    std::cout << "Char : " << Line << "\n";           // view the content of char variable


    const char *Line2 = &Line ;                       // convert from from char to const char*


    std::cout << "Const char : " << Line2 << "\n";     // view the content of const char* variable

    }                                                  // end of for statement

введите описание изображения здесь

Ответы [ 3 ]

0 голосов
/ 06 июля 2018
const char *Line2 = &Line ;

Магически не создает строку из вашего персонажа; так как строка должна быть завершена нулем (или 0), вы не можете передать этот указатель в cout, так как он ожидает обработки нескольких символов. Если бы вы изменили его на

char Line[2] = {0};  // 0 initialise all the chars
Line[0] = Body[i];
Line[1] = 0;         // completely not required, but just making the point

char* Line2 = &Line[0];   // there are other cleaner ways, but this shows explicitly what is happening
std::cout << Line2;

У вас не было бы UB.

0 голосов
/ 06 июля 2018

Проблема в том, что вы не завершаете Body нулевым символом (\0). И вторая проблема - ваша петля, вы пытаетесь получить доступ к чему-то, что находится за пределами диапазона. Код должен быть таким:

char Body[] = { 'H', 'e', 'l', 'l', 'o', '\0' };       // elements of char array

int size = sizeof(Body);                          // get size of Body array
char Line;

std::cout << "Size : " << size << "\n";           // view the size of Body array

for(int i=0; i<size; i++)                        // for statement : from first element to the last element of array
{                                                 // beginning  of for statement

Line = Body[i];                                   // get each element from Body array and put to char variable

std::cout << "Char : " << Line << "\n";           // view the content of char variable


const char *Line2 = &Line ;                       // convert from from char to const char*


std::cout << "Const char : " << Line2 << "\n";     // view the content of const char* variable

}                                                  // end of for statement

Вам нужен нулевой символ в конце любой необработанной строки на языке c / c ++, потому что это помогает понять окончание строки.

0 голосов
/ 06 июля 2018

Проблема в том, что вы обращаетесь к Body [5], когда запускаете цикл как

for(int t=0;t<=sizeof(Body);t++){}

если убрать знак =, все будет в порядке.

for(int t=0;t<sizeof(Body);t++){}

Также попробуйте конвертировать

std::const char *Line2 = const_cast<const char *>(&Line );

Используйте std::const_cast<>() для преобразования непостоянных в постоянные типы данных.

Также, чтобы удалить эти лишние вещи из консоли, вам нужно разыменовать const char *, если вы используете его напрямую. std :: cout пытается распечатать все, пока не встретится ноль, если вы передадите его const char *

Итак,

std::cout << "Const char : " << *Line2;
...