Funkcja strcat - gdzie jest błąd?

0

Mam za zadanie stworzyć wskaźnikową wersję funkcji strcat (przepisuje łańcuch znaków z jednej tablicy do drugiej).
Nie wiem na czym polega błąd w linijce z wywołaniem funkcji:
cannot convert 'char*' to 'char**' for argument '1' to 'void f_strcat(char*, char**)'

#include<stdio.h>
#include<string.h>

void *f_strcat(char *s[], char *t[]){
	int i, j;
	i = j = 0;
	while(*s[i] != '\0')
	i++;
	while((*s[i++] = *t[j++]) != '\0');
}

int main(){
	int i = 0;

	char tab1[] = "poczatek_";
	char tab2[] = "koniec";

	f_strcat(tab1, tab2);

	printf("%s", tab1);

	return 0;
}
3

char* s[] oznacza tablicę char*, a nie ciąg znaków (samo char* lub char[]).

Poza tym masz tam jeszcze wyjście poza zakres ciągu s (w drugiej pętli).

0

Czyli co powinienem zmienić?

0

A czego nie rozumiesz w tym, co napisałem? ;-)

0

Nie wiem czy błąd leży w deklaracji funkcji i tam przy argumentach nie powinno być wskaźników tylko tak:
void *f_strcat(char s[], char t[])

0

Już lepiej ;-)
Teraz mi powiedz dlaczego Twoja funkcja ma zwracać void*?

0

Pewnie nie powinno być tam wskaźnika, najpierw zrobiłem tę funkcję bez wskaźników i działała poprawnie, tyko nie wiem jak zrobić jej wersję wskaźnikową.

0

Przecież tej funkcji nie da się napisać bez wykorzystania wskaźników :P

0

A tak?

void f_strcat(char s[], char t[]){
	int i, j;
	i = j = 0;
	while(s[i] != '\0')
	i++;
	while((s[i++] = t[j++]) != '\0');
}
0

To teraz jeszcze weź pod uwagę, że wychodzisz poza zakres tablicy s.

0

Ale przecież funkcja ma dopisać zawartość t[ ] na koniec s[ ].

0

s ma pewien z góry określony rozmiar - nie możesz go przekroczyć ot tak se.

Najlepiej (i najprościej) byłoby, aby Twoja funkcja alokowała nowy ciąg znaków o wymaganej nowej długości i go zwracała.

0

nie, no bez jaj... Funkcja, która się nazywa 'strcat' nie może alokować pamięci. To byloby chore. Jak byś potem zwalniał tą pamięć? Wołając "strcat_release_memory"?

Gośc - najlepiej po prostu zrób to standardowo, tak jak to robią funkcje w nowszych funkcjach biblioteki standardowej - w tych, w których twórcy poszli po rozum do głowy. Czyli:

char * f_strcat( char * outString , size_t Size, char * SecondString ) 
{
      char * connected = NULL;

      if(outString != NULL && SecondString != NULL)
      {
           connected = outString;

            // Zamiast while'a mozna jeszcze for'ow uzyc - powinno byc szybsze, 
            // bo bedzie wtedy tylko jedna inkrementacja, 
           // ale uswiadomilem sobie to w trakcie pisania i nie chce mi sie tego poprawiac
           // no i Ci sie przyda tez pocwiczenie :P
           while((*outString) && Size > 0)  
           {
                outString++;
                Size--;
           }

           while((*SecondString) && Size > 0)
           {
                *outString = *SecondString;
                outString++;
                SecondString++;
                Size--;
           }
      }

      return connected;
}

Edit:
PS. Tutaj masz przykladowe wykorzystanie:

void main( void )
{
    char first[100];
    char second[100];

    strcpy(first, "Lol, raz, dwa, trzy.. ");
    strcpy(second, "proba mikrofonu");
    f_strcat( first, sizeof(first), second);
}

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