Dopisywanie do początku stringa [C++]

0

OK. Mam polecenie:
Napisz funkcję, która wywoływana jest z dwoma argumentami. Pierwszy to wskaźnik do tablicy znaków, w które 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.

Udało mi się napisać następujący kod:

#include <iostream>
using namespace std;

char* Sklejacz(char *wsk, const int rozmiar);

char uwaga[] = "UWAGA: ";

int main()
{
    char Napis[10] = "mleko";
    Sklejacz(Napis, 10);
    //cout << Napis;
}

char* Sklejacz(char *wsk, const int rozmiar)
{
    char schowek[100];
    int licznik = 0;

    for(; licznik < 7; licznik++)
    {
        schowek[licznik] = uwaga[licznik];
    }

    for(; ; licznik++)
    {
        if(!(schowek[licznik] = (*wsk++))) break;
    }

    for(int i = 0; schowek[i] != 0; i++) cout << i << endl;

    cout << schowek; // Wydruk pomocniczy

    return wsk;
} 

Jak widać, gotowy już string mam w tablicy "schowek". Teraz pozostało tylko przekopiować go do tablicy, na którą pokazuje wskaźnik (z zastosowaniem do reguł podanych w poleceniu). Niby proste, ale kiedy próbuję to zrobić np. tak:

for(int i = 0; ; i++, *wsk++)
{
      if(!(*wsk = schowek[i])) break;
}

To od razu dostaję w konsoli masę niezrozumiałych błędów. Próbowałem na wiele sposobów z podobnym rezultatem. Czy możecie mi powiedzieć jak mam to zrobić? Bo to chyba jest możliwe ;D ??

0

Jestem już trochę pijany ale nie wiem czy przypadkiem nie chodziło Ci o to?

#include <iostream>
#include <cstring>

char *f(char *w, unsigned r){
    char bufor[100];
    strcpy(bufor,"UWAGA:");
    strcat(bufor,w);
    unsigned len=strlen(bufor);
    if(len>r)strcpy(bufor+r-3,"...");
    memcpy(w,bufor,len);
    return w;
}

int main(){
    char cstr[9]="mleko";
    char *dst=f(cstr,9);
    for(unsigned i=0;i<9;i++)
        std::cout<<dst[i];
    return 0;
}

Zmień sobie cstr[9] na 12 i zobaczysz różnicę. Nie podobał mi się Twój kod. Był bardzo dziwny.:)

0

W tym zadaniu nie ma nic skomplikowanego: prosta arytmetyka, jeden prosty warunek oraz trzy proste pętli skro poddałeś się na tak prostym zadaniu to dalej będzie gorzej.

#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
 
char *WarningAppend(char *str,unsigned size)
  {
   static const char warning[]="UWAGA: "; 
   int slen=strlen(str),sbegin=sizeof(warning)-1,send=sbegin+slen,pend=send;
   if(send>=(int)size)
     {
      slen=max(0,slen-send+(int)size-4);
      pend=max(0,(int)size-1);
      send=max(0,pend-3);      
     }
   str[pend]=0;
   while(pend>send) str[--pend]='.';
   while(pend>sbegin) str[--pend]=str[--slen];
   for(slen=0;slen<pend;++slen) str[slen]=warning[slen];
   return str;
  } 

int main()
  {
   char test1[9]="mleko";
   cout<<WarningAppend(test1,sizeof(test1))<<endl;
   char test2[10]="mleko";
   cout<<WarningAppend(test2,sizeof(test2))<<endl;
   char test3[11]="mleko";
   cout<<WarningAppend(test3,sizeof(test3))<<endl;
   char test4[12]="mleko";
   cout<<WarningAppend(test4,sizeof(test4))<<endl;
   char test5[13]="mleko";
   cout<<WarningAppend(test5,sizeof(test5))<<endl;
   return 0;
  }
0

No nie wiem. Faktycznie dla len==r program podaje banialuki. Poprawiłem i myślę, że albo wynik jest już ok, albo źle zrozumiałem treść zadania (Porównując wyniki z Twoimi)

#include <iostream>
#include <cstring>

char *f(char *w, unsigned r){
    char bufor[100];
    strcpy(bufor,"UWAGA:");
    strcat(bufor,w);
    unsigned len=strlen(bufor);
    if(len>r)strcpy(bufor+r-3,"...");
    else len+=1;
    memcpy(w,bufor,len);
    return w;
}

int main(){
    char test1[9]="mleko";
    std::cout<<f(test1,sizeof(test1))<<std::endl;
    char test2[10]="mleko";
    std::cout<<f(test2,sizeof(test2))<<std::endl;
    char test3[11]="mleko";
    std::cout<<f(test3,sizeof(test3))<<std::endl;
    char test4[12]="mleko";
    std::cout<<f(test4,sizeof(test4))<<std::endl;
    char test5[13]="mleko";
    std::cout<<f(test5,sizeof(test5))<<std::endl;
    return 0;
}
0

#include <iostream>
#include <cstring>

char * Nowy(const char *, int);

int main()
{
const char *zdanie = "Maszyno"; //slowo glowne
std::cout << zdanie << std::endl;
zdanie = Nowy(zdanie, strlen(zdanie));
std::cout << zdanie;

std::cin.ignore();
std::cin.get();

return 0 ;

}

char * Nowy(const char *zd, int n)
{
const char * zdanie = "KOWBOJ"; // Wyraz dodawany na poczatku

 char *wsk = new char[strlen(zd) + 1]; // wskaznik
 wsk[strlen(zd)] = '\0';
 
 if(n > strlen(zdanie))
 {
      int i;
      for(i = 0; i < strlen(zdanie); i++)
       wsk[i] = zdanie[i];
      for(int j = i; zd[j] != 0; j++) // dopisujemy w wolne miejsce literki ze slowa glownego
       wsk[j] = zd[j];

      return wsk;
 }
 else // gdy wyraz dodawany jest za dlugi od slowa glownego
 {
     int i, dl;
     for(i = 0; i < n; i++)
      wsk[i] = zdanie[i];
     dl = n - 3;             // ostatnie 3 literki to kropki
     for(i = n - 1; i >= dl; --i)
      wsk[i] = '.';
      
     return wsk;
 }

}

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