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.
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 :)
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)
katelx napisał(a):
majac 2 tablice znakow
first
isecond
mozesz po prostu zrobicstrcpy(&first[strlen(first)], second)
(zakladajac ze tablicafirst
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
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 ;)
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);