Funkcja dopisującą na początek tablicy C-string

0

Napisz funkcję, 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.

#include <iostream>

using namespace std;

char * funkcja( char * tab, int rozmiar );
int main()
{
    const int rozmiar = 100;
    char tablica[ rozmiar ] = { "Tutaj jest przykladowy tekst" };
    funkcja(tablica,100);

    return 0;
}
char * funkcja( char * tab, int rozmiar )
{
    char * kopia_tablicy = tab;
    while(rozmiar)
    {
        tab[rozmiar--];
    }
    tab = {"Uwaga"};

    for(int i = 6, j = 0; i < rozmiar, j < rozmiar; i++,j++)
    {
        tab[i] = kopia_tablicy[j];
    }

    cout << tab;
    return tab;
}

Zrobiłem take coś,tylko że po kopiuje mi tylko tekst uwaga.

1
    while(rozmiar)
    {
        tab[rozmiar--];
    }

cofnąłem do 0 elementu

omg. Brak mi słów.

tab jest wskaźnikiem na początek tablicy. Nic nie musisz cofać, szczególnie w tak pokraczny (i niedziałający) sposób jak wyżej.

tab = {"Uwaga"};

Ta linia nie powinna się kompilować.

Twoim zadaniem jest dodanie "UWAGA: " na początek tablicy.
Najpierw policz, czy zmieści się w buforze (długość obecnego stringa + długość "UWAGA: " + null terminator).
Jeśli tak: przesuń obecny string, na początku wpisz uwaga.
Jeśli nie: przesuń odpowiednią liczbę znaków, żeby zakończyć ..., na początku wpisz uwaga.

W tagu dałeś C++, więc możesz sobie uprościć zadanie kosztem wydajności:

string s = "UWAGA: ";
s += tab;
if(s.size() >= rozmiar) s = s.substr(0, rozmiar-4) + "...";
memcpy(tab, s.data(), rozmiar);
return tab;
0

Znaki w tab[] musisz przenosić znak po znaku od końca. dopiero później wkopiować na początek słowo "Uwaga"

0

to jak w funkcji wpisać tekst uwaga do tej tablicy ?

1

Jak chcesz się bawić w sposoby rodem z C: strncpy.

0

bo chciałem ten program napisać bez żadnych funkcji bibliotecznych, da się ? To zadanie jest z symfonii.
Jeszcze drugie pytanie jak przesunąć string ? Bo mogę przesunąć tablicę o 6 znaków, ale co z tego jak napis się nie przesunie, tylko tablica.

1

Tak, da się. Spójrz na post @_13th_Dragon​a, dokładnie opisał co masz zrobić.

dlatego uważam, że symfonia nie nadaje się do nauki C++. Po to jest biblioteka standardowa, żeby z niej korzystać. Pod maskę można zawsze zajrzeć później w razie potrzeby.

1

Masz niepoprawne podejście.
Jeżeli nie radzisz sobie z zadaniem to wróć i jeszcze raz przeczytaj ostatni rozdział.
Jeżeli to też nie pomaga wywal książkę i weź inną.
Bo na 100% nic ci z tego nie przyjdzie jeżeli dostaniesz gotowe rozwiązanie na forum.
Nie da się nauczyć jeździć na rowerze poprzez samo patrzenie jak inni jeżdżą, trza samemu próbować do skutku.

0

Mógłbyś ktoś pomóc to napisać bez funkcji bibliotecznych ? Nie miałem jeszcze omawianych stringów, bo w symfonii to dopiero 12dział.
Mój kod:

#include <iostream>

using namespace std;

char * funkcja( char * tab, int rozmiar );
int main()
{
    const int rozmiar = 100;
    char tablica[ rozmiar ] = { "Tutaj jest przykladowy tekst" };
    funkcja(tablica,100);

    return 0;
}
char * funkcja( char * tab, int rozmiar )
{
    char * kopia_tablicy = tab;
    char tab1[] = {"Uwaga"};

   for(int i=0;i>=rozmiar;++i)
   {
       tab[i+7]=tab[i];
   }
   int i = 0;
   while(tab1[i])
   {
       tab[i] = tab1[i];
       i++;
   }
   cout << tab;
    return tab;
}

czemu mi zjada kawałek tekstu?

0
  1. Policz ile znaków zajmuje tekst -> BaseLen
  2. Policz ile znaków zajmuje wstawiane słowo ze spacją -> AddLen
  3. Policz ile znaków zajmie nowy tekst razem ze znakiem końca -> SumLen
  4. Jeżeli SumLen <= rozmiar to kopiujesz jak leci i na tym koniec
  5. Jeżeli BaseLen+4 > Rozmiar to wypisz komunikat o błędzie i na tym koniec
  6. Wylicz NewLen = SumLen-1-3-AddLen
  7. Wpisz znak końca do tab[]
  8. Wpisz znaki "..." do tab[]
  9. W pętle od NewLen-1 do 0 kopiujesz tab[i+AddLen]=tab[i];
  10. Kopiujesz wstawiane słowo do tab[]

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