Program do łączenia i dodawania tekstu

0

Witam państwa!
Potrzebuje pomocy w napisaniu programu który będzie łączył dwa wyrazy tylko problem polega na tym że nie mogę używać funkcji strncat.
Program ma być napisany w języku C. Potrzebuje g na poprawę z podstaw programowania .Za wszelkie rady i pomoc serdeczne dziękuje.

2

majac 2 tablice znakow first i second mozesz po prostu zrobic strcpy(&first[strlen(first)], second) (zakladajac ze tablica first ma wystarczajaco miejsca). btw daj program ktory napisales to ktos ci wytknie bledy :)

1

Nie uzywajac strncpy, strncat mozesz to np zrobic w ten sposob:
->tworzysz funkcje ktora przyjmuje za argument dwa wskazniki na char
->zapisujesz do jakiejs zmiennej sume dlugosci tych tablic + 1 na '\0' (uzywajac np strlen)
->tworzysz tablice o takim rozmiarze
->iterujesz po tych tablicach i kopiujesz je do tej nowej (np uzywajac petli do czasu napotkania '\0' albo korzystajac z tych dlugosci tablic)

0
katelx napisał(a):

majac 2 tablice znakow first i second mozesz po prostu zrobic strcpy(&first[strlen(first)], second) (zakladajac ze tablica first ma wystarczajaco miejsca). btw daj program ktory napisales to ktos ci wytknie bledy :)

#include <stdio.h>

void strncat (char *s, char *t, int n) {

s = (char*)malloc (strlen(t) + 1);


while (*s != '\0')
    s++;

int count = 0;

while (++count <= n)
    *s++ = *t++;

*(++s) = '\0';
}

int main () {
char *t = " Johny";
char *s = "Bravo";


printf ("wczesniej concat: %s\n", s);

strncat(s, t, 4);


printf ("teraz concat: %s\n", s);

return 0;
}

mam taki program tylko zamiast dodawać wyraz wyswitla tylko ten z drugiej tablicy

0

Jeśli już chcesz od razu tworzyć stringa, to absolutnie nie tak:

char t = "Johny"  /* Robisz tutaj przypisanie łańcucha do pojedynczego znaku. */

Czym to kompilujesz, że Ci się na tym program nie wywala?

Po drugie,

s = (char*)malloc (strlen(t) + 1);

Alokujesz pamięć do raz już wykorzystanego (błędnie o czym wspominam wcześniej) wskaźnika i to w dodatku próbując odczytać długość ciągu t (który nawet nie jest ciągiem, ani wskaźnikiem... to zwykły char) zwiększoną o jeden... To się nie uda. Tutaj strlen() najpewniej zwróci 1, albo po prostu się wywali...
Dodatkowo: alokujesz pamięć o długości równej długości ciągu t, ale to błąd. Ty chcesz do długości ciągu s dodać długość ciągu t. Więc powinineś podać rozmiar będący sumą obu ciągów.
Po trzecie:

/* Warunek zadziała poprawnie, ale niepotrzebnie stosujesz <= */
while (++count <= n) /* Zastosuj porównanie mniejszości i post-inkrementację */
    s++ = t++;             /* Tutaj błąd...  */

*(++s) = '\0';

Błąd polega na tym, że s jest wskaźnikiem wskazującym na początkowy element, czyli indeks 0. Ty przesuwasz go na równi ze wskaźnikiem t, więc do elementu s[0] przekopiowywany jest element o tym samym indeksie z t[0] itd... Stosuj zapis tablicowy, jeśli jeszcze gubisz się na wskaźnikach ;)

Dodatkowo... korzystaj z formatowania dla konkretnego języka ;)

0

A po co Ci dynamiczna alokacja w tej funkcji? Domyślna implementacja nie dokonuje alokacji, myślę, że twoja funkcja też nie musi.

A kiedy już wykonujesz kopiowanie jednego cstring'a do drugiego, to zastanów się, kiedy to kopiowanie powinieneś zakończyć:

#define SIZE 1000

char s1[SIZE] = "Hello";
char s2[SIZE] = "World!";

strncat(s1, s2, SIZE - 1);

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