Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wskaźniki do tablic znaków- zadanie

Ostatnio zmodyfikowano 2013-06-30 15:08
Autor Wiadomość
Matix8741
Temat założony przez niniejszego użytkownika
Wskaźniki do tablic znaków- zadanie
» 2013-06-26 15:38:43
Czytam "Symfonie c++" i utknąłem na zadaniu ze wskaźników mianowicie: Napisz funkcje, która wywoływana jest z dwoma argumentami. Pierwszy to wskaźnik do tablicy znaków, w której jest już jakiś C-string. Drugi to rozmiar tej tablicy. Funkcja ta ma do początku bieżącej treści tablicy znaków dopisać tekst "UWAGA:". Jeśli w rezultacie powstałby C-string dłuższy, niż na to pozwala obecny rozmiar tablicy znaków - niech trzy ostatnie możliwe znaki zostaną zastąpione trzema kropkami. Jako rezultat swej pracy funkcja ta ma zwracać wskaźnik do tablicy znaków, na której dokonała zmiany. Wykombinowałem taki kod:
C/C++
#include <iostream>
using namespace std;
char * uwaga( char *, int );
int main()
{
    const int rozmiar = 55;
    char tekst[ rozmiar ] = { " za 3 sek nastąpi autodestrukcja" }, * wsk = tekst;
    uwaga( wsk, rozmiar );
    cout <<* wsk;
    return 0;
}
char * uwaga( char * zmieniacz, int ile )
{
    char * przechowywacz = new char[ ile ], uwaga[] = { "UWAGA:" };
    int g = 0;
    while( * zmieniacz != 0 )
    {
        *( przechowywacz++ ) =*( zmieniacz++ );
        g++;
    }
    zmieniacz -= g + 1;
    int i = 0;
    for(; i < 6; i++, zmieniacz++ )
    {
        * zmieniacz = uwaga[ i ];
    }
    while( * zmieniacz != 0 )
    {
        zmieniacz++;
        i++;
    }
    int czy = 0;
    while( i < ile )
    {
        if( * zmieniacz == 0 )
             czy++;
       
    }
    zmieniacz -= ile + 7;
    while( * przechowywacz != 0 )
    {
        *( zmieniacz++ ) =*( przechowywacz++ );
    }
    if( czy >= 6 )
    {
        zmieniacz -= 3;
        for( int i = 0; i < 3; zmieniacz++, i++ )
             * zmieniacz = '.';
       
    }
    zmieniacz -= ile + 1;
    return zmieniacz;
}

Co jest nie tak? Bo w programie nic się nie pokazuje (tak jakby jakaś pętla się nie kończyła), a kompilator nie wyświetla żadnych błędów.
P-86224
pekfos
» 2013-06-26 18:29:57
C/C++
while( i < ile )
{
    if( * zmieniacz == 0 )
         czy++;
   
}
Jeśli i < ile jest prawdziwe, to program się tu zatrzyma.
P-86244
Matix8741
Temat założony przez niniejszego użytkownika
» 2013-06-26 19:48:29
Masz rację, ale nadal program nie działa. Zauważyłem, że wskaźnik
char * wsk
 nie wskazuje na tablice znaków
tekst
P-86257
abdi
» 2013-06-26 21:30:14
musisz przypisać do siebie wskaźniki
wsk = tekst
P-86291
Matix8741
Temat założony przez niniejszego użytkownika
» 2013-06-26 21:31:56
tak nie wystarczy ?
char tekst[ rozmiar ] = { " za 3 sek nastąpi autodestrukcja" }, * wsk = tekst
P-86292
abdi
» 2013-06-26 21:42:41
ciągi znaków są wyjątkowym tworem które możesz sobie zadeklarować w taki sposób.
char * wsk = "abcd";


w przypadku innego typu np int taka instrukcja w ogóle by się nie skompilowała.
int * wsk2 = 2;


i ty właśnie sobie deklarujesz nowy wskaźnik na jakiś tam tekst, ale on znajduje się w całkiem odrębnym  miejscu w pamięci.

jeśli chcesz aby wskaźnik wskazywał na to samo miejsce to musisz użyć:
wsk = tekst


Mam nadzieję że trochę rozjaśniłem.
P-86297
pekfos
» 2013-06-26 21:46:51
char * wsk = "abcd";
w przypadku innego typu np int taka instrukcja w ogóle by się nie skompilowała.
Za to tu będzie warning, albo nawet błąd, bo c-string jest typu const char*.

A z tym
* wsk = tekst
 chodziło o
char * wsk = tekst
, a nie o przypisanie wskaźnika do znaku.
P-86298
Matix8741
Temat założony przez niniejszego użytkownika
» 2013-06-26 23:07:59
A ja nadal nie wiem gdzie mam błąd ;(
P-86322
« 1 » 2 3
  Strona 1 z 3 Następna strona