łączenie/dodawanie tekstu w C

0

witam próbuje napisać program który pod zmiennymi i,j typu int przyjmuje jakieś jakieś wartości następnie zamieniamy je na char jeśli liczba jest z zakresu 0-9 a więc jedno cyfrowa to przed liczbe wstawi zero a jak jest 2 cyfrowa to zostawia ją tak jak jest. Następnie robi to samo z 2 liczbą a na koniec łączy je w jedną tablice char zawsze o długości 4 znaków. Mój kod:

#include <stdlib.h>
#include <stdio.h>




 int main()
 {
    int i=2, j=1;
    char *z1,*z2;
    static char v[4];  //z1, z2 zmienne do przekazania v - tablica docelowa

    sprintf(&z1, "%d", i);
    sprintf(&z2, "%d", j);



    if (strlen(&z1)==1) {strcat(v,"0"); strcat(v,&z1);} else {strcat(v,&z1);}
    if (strlen(&z2)==1) {strcat(v,"0"); strcat(v,&z2);} else {strcat(v,&z2);}

    printf("v=%s",v);


    return 0;

}
} 

Kod się kompiluje i działa tak jak bym sobie tego życzył aczkolwiek podczas kompilacji wyskakuje cała masa ostrzeżeń odnoście sprintf strlen i strcat. Z czego może to wynikać, jakie parametry powinny dostać te funkcje aby się nie czepiał?

0

z tego co mi sie wydaje to nie trzeba używać & przy char , i jak piszesz int i=0; to chyba lepiej napisać int i; i po deklaracjach nadać wartosc 0

0

Nie mam pojęcia z jakiego kompilatora korzystasz (nigdy nie pracowałem z żadnym który dopuszczałby "niesparowane nawiasy"), natomiast to kompiluje się pod g++:

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




 int main()
 {
    int i=2, j=1;
    char z1,z2;
    static char v[4];  //z1, z2 zmienne do przekazania v - tablica docelowa

    sprintf(&z1, "%d", i);
    sprintf(&z2, "%d", j);



    if (strlen(&z1)==1) {strcat(v,"0"); strcat(v,&z1);} else {strcat(v,&z1);}
    if (strlen(&z2)==1) {strcat(v,"0"); strcat(v,&z2);} else {strcat(v,&z2);}

    printf("v=%s",v);


    return 0;

}
0

sneek: gdy wyrzuce "gwiazdki" przy deklaracji zmiennych typu char i "&" przy funkcjach to program sie kompiluje a potem wywala blad

4ggr35510n:
nawiasy sa "sparowane" tylko wkradl mi sie na gorze blad faktycznie jedna klamra za duzo... a że to się kompiluje to ja wiem, ale pytam sie o ostrzeżenia które wypisuje kompilator screen: http://screenshooter.net/3321510/ctjdavj

0

Ten program ma błędy. Zacznijmy od tego, że traktujesz pojedynczy znak jak ciąg znaków. Ciąg znaków "1" to tak naprawdę "1\0" (bajt zerowy oznacza koniec ciągu). Funkcja sprintf() zapisuje ciąg znaków, nie znak. Z podobnego względu używanie strcat() jest tu grubą przesadą (hint: przecież v jest tablicą). No i nie zapominaj o tym bajcie zerowym.

EDIT: Powyższe dotyczy głównie kodu 4ggr35510n, ale kod rafal92909 też ma kwiatki. Zdajesz sobie sprawę z tego, że z1 i z2 to są wskaźniki? One muszą wskazywać na jakiś zaalokowany obszar pamięci, a u Ciebie tego nie ma... i gdzie sprintf() ma zapisać wynik? Reszta podobnie co wyżej. v jest tablicą. Skorzystaj z niej odpowiednio, a nie wytaczasz armatę w postaci strcat().

0

Sugerując się pierwszą wersją programu, "z1" i "z2" mają być cstringami. Okej, tylko gdzie alokujesz pod nie pamięć?
Ponadto żadna z użytych przez Ciebie funkcji nie wymaga użycia operatora "&", z racji że nie modyfikuje argumentów bezpośrednio (nie przepina wskaźników na inny obszar pamieci).

0

No i cztery bajty to za mało żeby zapisać czteroznakowego c-stringa.

0

No więc:
Wszystkie funkcje dotyczące stringów z jakich korzystasz, przyjmują w pierwszym argumencie char* albo const char*.

Ty natomiast podajesz im char**.

Rozpatrzmy zmienną Z o typie T.
Wyrażenie &Z zwraca wskaźnik na tę zmienną. Wskaźnik ten będzie typu T*.

Podajesz funkcjom "stringowym" & ( char* ) zmienna, czyli char**.
Konwersja niejawna z char** na char* nie powinna nastąpić[potrzebne źrodło], stąd też moje zdziwienie co do jakości kompilatora z jakiego korzystasz.

0
sneek napisał(a)

jak piszesz int i=0; to chyba lepiej napisać int i; i po deklaracjach nadać wartosc 0

totalna bzdura napisana po to by coś napisać. Niestety kolego ale inicjalizacja zmiennych jest jak najbardziej zalecana. Nie wypowiadaj się na temat, w którym masz cząstkową "wiedzę"

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