[ ognjen_z @ 01.06.2003. 05:51 ] @
Napisao sam potprogram koji vrsi izvesne obrade na nizu. Kao rezultat dobijam dva niza. Interesuje me kako u glavnom programu ispisati ta dva niza koji su nastali u potprogramu. ......molim vas za pomoc......
[ Časlav Ilić @ 01.06.2003. 11:11 ] @
Ako nisi dinamički alocirao te nizove, ne možeš nikako da ih „izvezeš“ iz funkcije. Umesto toga, deklariši nizove u glavnom programu, pa ih pošalji funkciji pri pozivu. Ako nije jasno, daj kôd, pa da vidimo.
[ ognjen_z @ 01.06.2003. 18:07 ] @
...pretpostavljam da problem treba resiti preko pokazivaca, ali mi nije jasno kako to da izvedem... moj program izgleda ovako:
#include <ctype.h>
#include <stdio.h>
#define M 1000

char f_cif (char tekst[], int n) {
int i, j=0, k=0;
char znak, cifre[M], slova[M];

gets(tekst);
for (i=0;i<n;i++) {
znak=getchar();
if (isdigit(znak)!=0) cifre[j++]=znak; /* <--- ovo su ta dva niza */
else if (isalpha(znak)!=0) slova[k++]=znak;
}
}



#include <stdio.h>
#define N 1000

main () {
char tekst[N], znak;
int n=0, i;

printf("\nUnesi proizvoljan tekst (ctrl+Z za izlaz).\n");
while ((znak=getchar())!=EOF) tekst[n++]=znak;
for (i=0;i<n;i++) putchar(tekst);

/* ------ poziv potprograma ---------- */
??????
/* ------ ispisivanje rezultata ------ */
}

[ Časlav Ilić @ 02.06.2003. 10:04 ] @
Code:

#include <ctype.h>
#include <stdio.h>

#define N 1000

char f_cif (char tekst[], int n, char cifre[], int* nc, char slova[], int* ns) {
    int i;
    char znak;
    *nc=0;
    *ns=0;
    for (i=0;i<n;i++) {
        znak=tekst[i];
        if (isdigit(znak)!=0) cifre[(*nc)++]=znak;
        else if (isalpha(znak)!=0) slova[(*ns)++]=znak;
    }
}

main () {
    char tekst[N], znak;
    int n=0, i;

    printf("\nUnesi proizvoljan tekst (ctrl+Z za izlaz).\n");
    while ((znak=getchar())!=EOF) tekst[n++]=znak;
    for (i=0;i<n;i++) putchar(tekst);

    /* ------ poziv potprograma ---------- */
    char cifre[N], slova[N];
    int ns; /* broj slova */
    int nc; /* broj cifara */
    f_cif(tekst,n,cifre,&nc,slova,&ns);

    /* ------ ispisivanje rezultata ------ */
    /* ... */
    printf("Slova: ");
    for (i=0;i<ns;i++) printf("%c ",slova[i]);
    printf("\n");
    printf("Cifre: ");
    for (i=0;i<nc;i++) printf("%c ",cifre[i]);
    printf("\n");
}


Kao što rekoh, nizovi slova i cifara definisani su u glavnom programu, pa prosleđeni funkciji. Njihove dužine su prosleđene funkciji kao pokazivači, da bi funkcija mogla da ih izmeni.
[ leka @ 02.06.2003. 15:44 ] @
Ja bih samo dodao da se eventualno moze problem resiti i sa globalnim nizovima (deklarisanim kao globalne varijable). Naravno, ja sam licno za Caslavovo (ili Caslavo?) resenje, koje zapravo predstavlja tipicno C-ovski nacin rada.
[ alkal @ 02.06.2003. 17:54 ] @
Mala prepravka:
Code:

main () {
    char tekst[N];  /* polazni niz */
    char znak;
    int n=0, i;
    char cifre[N], slova[N];    /* trazeni nizovi */
    int ns;         /* broj slova */
    int nc;         /* broj cifara */

    printf("\nUnesi proizvoljan tekst (ctrl+Z za izlaz).\n");
    while ( (znak=getchar())!=EOF && n<N ) tekst[n++]=znak;
    printf("Uneli ste:");
    for (i=0; i<n; i++) putchar(tekst[i]);
    putchar('\n');

    /* ------ poziv potprograma ---------- */
    f_cif(tekst, n, cifre, &nc, slova, &ns);

    /* ------ ispisivanje rezultata ------ */
    printf("Slova: ");
    for (i=0; i<ns; i++) putchar(slova[i]);
    putchar('\n');

    printf("Cifre: ");
    for (i=0; i<nc; i++) putchar(cifre[i]);
    putchar('\n');
}

Dodat izraz n<N unutar while() uslova sprečava "prelivanje" niza.