napis char * - wstawienie litery

0

Witam
Mam problem z podmianą litery w napisie.
Teoretycznie powinno to zadziałać jak z wstawianiem elementu do tablicy a linijka napis[1]='a' powoduje naruszenie ochrony pamięci. Jak inaczej można to zrobić i przy okazji gdzie mogę szukać wartościowych informacji o napisach w postaci char*?

#include <iostream>
using namespace std;

int main (){
	char * napis={"slowo"};  //powoduje warning ale ok
	cout<<napis[1]<<endl;
	napis[1]='a';
	cout<<napis<<endl;
	
return 0;
}
0

Zastanów się co masz tam napisane. Powinno być char * napis="slowo";

0

Na dobrą sprawę to ten kod nie powinien się kompilować. "słowo" to stała typu const char *.
Możesz zrobić coś w stylu:

#include <iostream>
using namespace std;

int main()
{
    char napis[6] = "slowo"; //powoduje warning ale ok
    cout << napis[1] << endl;
    napis[1] = 'a';
    cout << napis << endl;

    return 0;

}

0
winerfresh napisał(a)

Zastanów się co masz tam napisane. Powinno być char * napis="slowo";

poprawiłem, nadal naruszenie ochrony przy próbie wstawienia litery

Karolaq napisał(a)

Na dobrą sprawę to ten kod nie powinien się kompilować. "słowo" to stała typu const char *

czyli mam traktować char * jak cost char * - nie mam możliwości zmiany w char * ?

Karolaq napisał(a)

Możesz zrobić coś w stylu:

#include <iostream>
using namespace std;

int main()
{
    char napis[6] = "slowo"; //powoduje warning ale ok
    cout << napis[1] << endl;
    napis[1] = 'a';
    cout << napis << endl;

    return 0;

}

to by było ok, tyle, że nie znam długości napisu, dlatego uzywam char * a nie char[]

1

Zdecydowanie nie masz zielonego pojęcia co robisz ;)
char* to jest nic innego jak wskaźnik na typ char - nie mniej, nie więcej!
char *napis = "whatever"; -> w tym wypadku napis jest wskaźnikiem do miejsca w pamięci gdzie znajduje się tekst whatever. Literały w C++ są stałe - próba ich zmiany to zło.
Zrobienie czegoś takiego:

char *napis1 = "tekst";
char *napis2 = "tekst";

wcale nie oznacza, że tekst będzie w różnych miejscach w pamięci - najprawdopodobniej będzie w jednym - czyli oba wskaźniki będą pokazywały na to samo.

Jeżeli chcesz edytować to musisz zrobić coś w tym stylu:

char napis1[] = "jakis tekst";
char napis[20] = "inny tekst";

Jak przed zobaczeniem wyrazu nie znasz jego rozmiaru to trzeba sobie to samemu napisać - alokacja odpowiedniej ilości pamięci, ewentualne kopiowanie itd.

To tyle jeżeli chodzi o klasyczne c-stringi, a teraz dzieje się magia ;) : zapoznaj się z klasą i biblioteką std::string, które już realizują wszystko co jest potrzebne.

string str1 = "jeden";
string str2, str3;
str2 = " i dwa";
str3 = str1 + str2;
cout << str1 << "\n" << str2 << "\n" << str3 << endl;
0
byku_guzio napisał(a)

Literały w C++ są stałe(...)klasyczne** c-stringi**

już wiem czego szukać

byku_guzio napisał(a)

zapoznaj się z klasą i biblioteką std::string,

używałem, bardzo wygodna :)
ale tym razem potrzebowałem char*

1 użytkowników online, w tym zalogowanych: 0, gości: 1