2
int scat(const char * str1, const char * str2)
{
    char * str = str1;
.
.
.
}

Значение типа const char нельзя использовать для инициализации сущности типа char

Как скопировать значение str1 ? Отказаться от использования const в аргументах функции - нельзя. Нужна работа с указателем на эту строку.

neko69
  • 947
  • А что вы хотите сделать? Если строку нельзя изменять через str1, то вы не должны её пытаться поменять и через str. Просто const char* str = str1; не подойдёт? – VladD Oct 19 '15 at 20:07
  • 1
    @neko69 Это всего лишь признак того, что вы собираетесь сделать что-то неправльное.:) Не надо пытаться присвоить указатель типа const char * указателю типа char *.:) – Vlad from Moscow Oct 19 '15 at 20:09
  • Мне нужно для обработки str1 скопировать ее в str. Изменять мне ничего не нужно, просто нужно двигаться по строке – neko69 Oct 19 '15 at 20:17
  • @neko69 Какие тогда проблемы? Объявите этот указатель также как имеющий тип const char *. – Vlad from Moscow Oct 19 '15 at 20:25
  • нужно будет его обнулять – neko69 Oct 19 '15 at 20:26
  • @neko69 Смотрите мой ответ.:) – Vlad from Moscow Oct 19 '15 at 20:36

2 Answers2

10

Если требуется просто для работы ввести еще одну переменную-указатель, то почему бы просто не написать? :)

const char * str = str1;

или в C++ можно также написать

auto str = str1;

Я думаю, что ваше недопонимание связано с тем, что вы думаете, что квалификатор const в данном объявлении относится к самому указателю, и вы не сможете изменять его значение.

Это не так. Сам указатель не константный. Вы можете присваивать ему любые значения. Это всего лишь строки, на которые он будет указывать нельзя изменять, используя этот указатель.

Сравните.

const char * str = str1;
str = str2;
str = nullptr;

В этом фрагменте значение указателя str меняется.

Если бы вы объявили сам указатель константным, то этого делать было бы нельзя.

const char * const str = str1;
             ^^^^^
str = str2;     // ошибка компиляции
str = nullptr;  // ошибка компиляции
  • не по теме но интересно, const char * str - константа-данные; const char * const str - константа данные+указатель? и тогда char * const str это будет константа-указатель? прошу прощения за такую кашу, но не знаю как форматировать сообщения в комментариях – neko69 Oct 19 '15 at 20:38
  • 2
    @neko69 Да, char * const str - это сам указатель константный, а данные, на которые он указывает, не константные. – Vlad from Moscow Oct 19 '15 at 20:42
2

Можно просто привести указатель:

char *str = (char*)str1;

Но это не даёт тебе права изменять строку.

Qwertiy
  • 123,725
  • скопируется указатель или значение? – neko69 Oct 19 '15 at 20:21
  • @neko69, скопируется указатель. – Qwertiy Oct 19 '15 at 20:22
  • @Qwertiy, это не c++ стиль. Если надо приводить тип, то лучше воспользоваться const_cast. А еще лучше не мудрствовать и воспользоваться ответом Vlad from Moscow. – sba Oct 19 '15 at 20:45
  • @sba, что это не си++-стиль, я знаю и меня это как-то не волнует. По поводу ответа Vlad from Moscow - во-первых, он дан после моего, а во-вторых, спросили, как сделать, в одном из комментариев отметив, что строку менять и не надо - я ответил. Вариант, что некая функция объявлена с аргументом char* хотя строку она и не меяет, вполне реален. Мой ответ в этом случае годится, а его - нет. – Qwertiy Oct 19 '15 at 21:55
  • @Qwertiy, ответ годится чтобы решить, скорее всего, несуществующую проблему. Очевидно же что без опубликованных тут ответов neko69 не до конца понимал разницу между си-строкой и указателем на нее. Сейчас функция не меняет строку, а завтра автор уволится и ему на смену придет новичек, которому компилятор уже не подскажет что строку менять не стоит. И кажется что на момент моего коментария у вопроса был только один тег - c++. – sba Oct 19 '15 at 22:25
  • @Qwertiy, кстати вариант когда функция объявлена с указателем на неконстантные данные хотя их и не меняет вполне реален, и скажем так - безвреден. Много хуже именно случай автора, когда вполне ожидаемо что функция менять данные не будет. И пусть об этом заботится компилятор, а не те люди что будут сопровождать код. – sba Oct 19 '15 at 22:32