Member 13995616 Ответов: 3

C-код ведет себя странно.


#include<iostream>
using namespace std ; 

int main ()
{
  char *c = new char(100);

strcpy( c , (char*)"http://localhost:4000/index.html") ; 


strcpy ( c, &c[6] ) ;

printf(" url is %s\n" , c  ) ; 

return 0 ;

}


Этот код выводит :
URL-адрес /localhost:ndex.htmlx.html

Что я уже пробовал:

I wanted to output /localhost:4000/index.html. I know that this can be done through assigning c = c+ 6 but I want to know how does the above code works ? 
Where does the number 4000 disappear and from where does the extra stuff comes from ?

3 Ответов

Рейтинг:
21

CPallini

Цитата:
strcpy ( c, &c[6] ) ;
В приведенной выше строке вы находитесь неправильное использование strcpy.
Из документация[^]:

Чтобы избежать переполнения, размер массива, на который указывает пункт назначения, должен быть достаточно длинным, чтобы содержать ту же строку C, что и источник (включая завершающий нулевой символ), и не должно перекрываться в памяти с исходным кодом.

Перекрытие пункта назначения с источником-это именно то, что вы делаете.


Пожалуйста, обратите внимание, что ваш код представляет собой странную смесь C и C++ Имея в своем распоряжении C++ компилятор, вы можете просто написать:
#include <iostream>

int main ()
{
  const char * p = "http://localhost:4000/index.html";
  std::cout << (p+6) << "\n";
}


Рейтинг:
2

Shao Voon Wong

Эмпирическое правило: вы должны избегать strcpy к себе. Вы используете 2 различных переменных для параметров. Это должно решить проблему странности.


Рейтинг:
1

KarstenK

Это не странно, но "работает так, как задумано". Обратная косая черта-это специальный знак, который недопустим в простых строках, но сигнализирует о некоторых специальных символах, следующих за ними.

Чтобы справиться с этим правильно, вам нужно добавить вторую обратную косую черту для каждой отдельной обратной косой черты. Как это:

strcpy( c , (char*)"http:////localhost:4000//index.html") ;
Читайте в разделе Википедия для некоторых других озарений.


Rick York

Это не обратная косая черта. Это косые черты вперед, и они не являются escape-символами.