Что я делаю не так и как я должен делать то, что хочу?
Вы, похоже, неправильно поняли, что такое указатель.Указатель - это переменная, которая указывает на что-то еще.В этом случае
char s[100];
char *P = s;
P
указывает на первый символьный элемент s
.Это тот же указатель, на который s
затухает во многих контекстах.
У вас все еще есть только один массив для хранения 100 символов.У вас просто есть два идентификатора для этого массива, потому что вы можете получить его через s
или P
.
Если вы измените этот массив на месте с «egg» на «gge» или как угодно, P
по-прежнему просто указывает на тот же массив, что и изначально.Он не сохранил ничего, кроме местоположения (адреса), и это не то, что изменилось.
Если я смогу пройти двумя дорогами, чтобы добраться до твоего синего дома, и ты перекрасишь дом в зеленый, одиндорог до сих пор не приводит к первоначальному синему дому.Это не то, как работают дороги, или как работают дома, или как работают указатели.
Вы хотите где-то хранить исходные 3 или 4 символа, что означает, что вам нужен еще один массив символов или, что лучше, std::string
,Это сделает копию символов, которые вас интересуют, за до того, как вы их измените.
Минимальное рабочее изменение, вероятно,
// P = s <-- just stores the location
P = strdup(s); // <- copies the contents
, но учтите, что вам следует free(P)
в какой-то момент после того, как вы закончите с этим.Переключиться на std::string
действительно намного проще.
Простой пример использования семантики значения std::string
для копирования:
#include <string>
#include <algorithm>
#include <iostream>
// source is a copy of the string passed
std::string rotate_left(std::string source, size_t offset = 1)
{
std::rotate(source.begin(), source.begin()+offset, source.end());
return source;
}
int main()
{
std::string original{"eggsoup"};
// for interactive use: getline(std::cin, original);
std::string rotated = rotate_left(original);
std::cout << original << '\n' << rotated << '\n';
}