Wskaźnik char *wsk i zmiana konkretnej litery

0

Witam. Mój problem polega na tym że tworzę taki oto łańcuch:

char *wsk = "abcdefg";

następnie chciałbym zmienić literkę b, niestety w żaden znany mi sposób nie jestem w stanie tego zrobić

1

Stwórz tablicę. Teraz działa to w ten sposób, że kompilator weźmie sobie wszystkie stałe tekstowe i umieści je w pamięci, której domyślnie nie można modyfikować, a pod ten twój wskaźnik wstawi odwołanie do tego właśnie miejsca.

0

Poczytaj o C-Stringach, poczytaj o wskaźnikach. Dlaczego ostatnio wszystkim się wydaje, że char* to jest typ przechowujący napisy?
Zrozumienie różnic pomiędzy C-Stringiem, a wskaźnikiem typu char jest bardzo istotne i bez tego nie ma co się pchać dalej. Zmienna char* może co najwyżej pokazywać na miejsce w pamięci gdzie znajduje się napis, ale tego napisu nie przechowuje. C-Stringi są przechowywane w tablicach - jak mówi definicja C-String to jest ciąg znaków zakończony zerem(czyli ciąg zmiennych typu char/wchar_t).

Jeżeli chodzi o literały to ważne jest to, że taki zapis: char wsk = "napis"; nie jest do końca zgodny ze standardem. Powinno być const char wsk = "napis". Istotne jest też to, że mając takie dwie zmienne z przypisanymi adresami takich samych literałów

const char* wsk1 = "napis";
const char* wsk2 = "napis";

ze względu na optymalizacje kompilatora obie mogą pokazywać na to samo miejsce w pamięci(literał "napis" będzie siedział tylko w jednym miejscu pamięci), więc zmiana w nim czegokolwiek wywoła zmianę widoczną z poziomu obu tych zmiennych.

0
char t[] = "abcd";
t[1] = 'x';
cout << t;
0

Dlaczego ostatnio wszystkim się wydaje, że char* to jest typ przechowujący napisy?

nie ostatnio tylko zawsze, i pewnie dlatego że cała idea C-stringów to poronione rozwiązanie.

0
Azarien napisał(a)

nie ostatnio tylko zawsze, i pewnie dlatego że cała idea C-stringów to poronione rozwiązanie.

Idea cstringów jest prosta i przejrzysta. IMHO kompilator domyślnie powinien wymuszać konieczność użycia const w takich przypadkach i nie byłoby pytań typu "źle inicjuję ciąg znaków i nie mogę go zmienić. Co robię źle?"...
To, że język nie ma w standardzie mechanizmów opakowujących tablice znaków nie oznacza, że ich obsługa jest "poroniona".

0

Idea cstringów jest prosta i przejrzysta.
ale ich implementacja (oraz ogólniej implementacja tablic i wskaźników) w C jest prymitywna i błędogenna.

To, że język nie ma w standardzie mechanizmów opakowujących tablice znaków nie oznacza, że ich obsługa jest "poroniona".
jak nie jest jak jest ;-)

0
Azarien napisał(a)

ale ich implementacja (oraz ogólniej implementacja tablic i wskaźników) w C jest prymitywna i błędogenna.

Jak zatem według Ciebie powinna wyglądać implementacja tablic i wskaźników?

Azarien napisał(a)

jak nie jest jak jest ;-)

Język C opiera się na nieco innej filozofii programowania, która bliższa jest modelowi pamięci. Dzięki temu masz większą elastyczność i kontrolę nad używanymi zasobami. Opakowywanie i ukrywanie tego, że ciąg znaków jest w istocie blokiem pamięci kosztuje - albo większe zużycie zasobów (pamięci), albo realokacje, albo fragmentacje. Jeśli te koszta nie są dla Ciebie problemem, to możesz przecież sobie zaimplementować swój własny mechanizm obsługi ciągów znaków, lub skorzystać np. z biblioteki bstring. Masz taką możliwość, a nie wymóg :)

0
Kumashiro napisał(a)

Jak zatem według Ciebie powinna wyglądać implementacja tablic i wskaźników?

Jak w Pascalu. Przede wszystkim, aby wołana funkcja wiedziała, jak dużą tablicę otrzymuje w parametrze. Rozdzielenie pojęć „wskaźnik” i „tablica”.

Język C opiera się na nieco innej filozofii programowania, która bliższa jest modelowi pamięci.
Nie chodzi o filozofię. Chodzi o poważne niedostatki w obsłudze stringów. Intuicyjne operacje jak konkatenacja lub porównanie nie działają lub robią nie to czego programista mógłby się spodziewać. Bez dogłębszej wiedzy nawet nie da się ich prawidłowo używać, co widać w niniejszym wątku.
Ja wiem i ty wiesz, dlaczego w przedstawionym przykładzie powinno być użyte const Ale dlaczego początkujący ma być bombardowany takimi niuansami już na poziomie niewiele wyższym od hello world?

0
Azarien napisał(a)
Kumashiro napisał(a)

Jak zatem według Ciebie powinna wyglądać implementacja tablic i wskaźników?

Jak w Pascalu. Przede wszystkim, aby wołana funkcja wiedziała, jak dużą tablicę otrzymuje w parametrze. Rozdzielenie pojęć „wskaźnik” i „tablica”.

Czyli chciałbyś mieć referencje w C? Masz tą samą sytuację, co w przypadku cstringów - możesz sobie opakować tablicę strukturą z informacjami o rozmiarze i zajętości, przekazywać te dane dodatkowymi parametrami, stosować "strażników" itp. Język C daje Ci komponenty, z których możesz sobie złożyć co chcesz, jak chcesz, wybierając rozwiązanie, które w danym przypadku sprawdza się najlepiej. IMHO to jest lepsze rozwiązanie od jednego, z góry narzuconego przez język.

Azarien napisał(a)

Nie chodzi o filozofię. Chodzi o poważne niedostatki w obsłudze stringów. Intuicyjne operacje jak konkatenacja lub porównanie nie działają lub robią nie to czego programista mógłby się spodziewać. Bez dogłębszej wiedzy nawet nie da się ich prawidłowo używać, co widać w niniejszym wątku.

OK, w takim razie załóżmy, że dostajesz szansę na zaprojektowanie implementacji stringa w C. Co wybierzesz? Alokację wielkiego bloku pamięci "na zapas", realokację przy każdej konkatenacji, kopiowanie przy każdej konkatenacji, rozrzucenie fragmentów po całej pamięci tracąc ciągłość, ...? Skąd wiesz które rozwiązanie będzie najlepsze? A może jednak lepiej wybór pozostawić programiście, udostępniając mu tylko prymitywy, z których sobie złoży coś najlepiej dopasowanego do danego zadania/platformy? To właśnie daje Ci C. Traktuje programistę jak dorosłego człowieka, który wie nie tylko co chce zrobić, ale także jak chce to zrobić. Jeśli chcesz żeby kto inny podejmował za Ciebie takie decyzje, wybierasz inny język programowania, albo używasz gotowych bibliotek.

Azarien napisał(a)

Ja wiem i ty wiesz, dlaczego w przedstawionym przykładzie powinno być użyte const Ale dlaczego początkujący ma być bombardowany takimi niuansami już na poziomie niewiele wyższym od hello world?

Ale to są podstawy tego języka. Równie dobrze mógłbyś pytać dlaczego początkujący ma być bombardowany niuansami typu "krotka vs. tablica" w Pythonie. Aby pisać programy w danym języku, trzeba znać jego podstawy, ograniczenia oraz wymagania.

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