Почему не время (* s ++ = * t ++); работать на меня?

0

Я наткнулся на эту функцию в блоге, и я нашел ее действительно крутой. Я понимаю, как это работает концептуально, поскольку C++ был моим первым языком.

Однако, когда я попытался написать его в моей программе, он, похоже, не работает. Я googled повсюду, но я только нашел объяснения относительно того, как это работает, таким образом я был действительно тупик.

Вместо копирования NULL char [5] (который должен оцениваться как false, ничего не копировать и прерывать цикл), он дает две ошибки компиляции, говоря, что "я не могу увеличить значение типа char [6]" (вне -bounds для обоих массивов).

Почему мой цикл не разбивается на char [5]?

Я предполагаю, что это связано с тонкостями char и string, я попытался инициализировать строки вместо включенной cstring, которая тоже не работала, появляется аналогичная ошибка "не может увеличивать строку типа".

#include <iostream>
using namespace std;

int main () {
     char s[] = "hello";
     char t[] = "house";
     while (*s++ = *t++);
     cout << s;
     return 0;
}
  • 4
    Это твой настоящий код? Это не должно компилироваться.
  • 4
    @T.C.:Я думаю, что это означает, что «это дает две ошибки». И обе ошибки дают тип s и t .
Показать ещё 6 комментариев
Теги:
string
arrays
pointers
strcpy

2 ответа

8
Лучший ответ

Вы не можете увеличивать массив. Что бы это значило?

Попробуй это:

#include <iostream> 
using namespace std;

int main ()
{
   char s[] = "hello";
   char t[] = "house";

   char *ss = s;
   char *tt = t;
   while (*ss++ = *tt++);

   cout << s << endl;
}
  • 0
    Разве этот модифицированный код не использует UB путем записи в массив, указанный строковым литералом?
  • 4
    @templatetypedef: строковый литерал копируется в массив. Проблема возникает, когда вы инициализируете (или просто присваиваете) указатель на строковый литерал и пытаетесь его изменить.
Показать ещё 9 комментариев
-2

Строка "while (* ss++ = * tt++)" всегда будет истиной, потому что = является оператором присваивания. Вероятно, вы хотите "while (* ss++ == * tt" ")", который сравнивает равенство.

  • 3
    Нет, это будет ложь, если *tt == '\0' . И в этом суть, потому что целью является копирование до тех пор, пока не будет найден этот конкретный символ (нулевой терминатор).
  • 0
    Нет, как сказал Бенджамин, оператор присваивания возвращает присвоенное значение. Что позволяет вам делать такие вещи, как a=b=c;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню