Newsgroup: it.comp.lang.c
Titolo: L'errore c'è ma non lo vedo :'(

Ragazzi sono un vero principiante e sono caduto in qualche tipico errore di
logica che però non so correggere (il programma viene regolarmente
compilato).
Per fare un pò di esercizi sui puntatori ho fatto questo piccolo listato, ma
non capisco per quale motivo, la prima volta che chiamo la mia funzione
"subString", la esegue correttamente, le volte successive (la chiamo da
dentro un'altra funzioncina "printStr") mi restituisce quello che gli pare.
Potreste dirmi dove sbaglio?
Consigli su come migliorare il codice e altro sono ben accetti (tranne
quello di darmi all'ippica).
Grazie mille a tutti e scusatemi per il distrubo.
#include <stdio.h>
int main(void);
int strLen(char *);
void printStr(char *);
char * subString(char *,int start, int end);
int main(void){
    printf("Lunghezza della string \"Ciao\" = %d\n",strLen("Ciao"));
    printf("Substring della stringa \"Pippo va a scuola\" =
%s\n",subString("Pippo va a scuola",3,15));
    printStr("Pippo va a scuola");
    getch();
    return 0;
}
int strLen(char * str){
    int i = 0;
    while(*(str+i))
        i++;
    return i;
}
void printStr(char * str){
    int start=0;
    int end  =0;
    int cnt  =0;
    while(*(str+cnt)){
        printf("%s\n",subString(str,0,cnt));
        cnt++;
    }
}
char * subString(char * str, int start, int end){
    char * subs = "";
    int sLen    = 0;
    int cnt     = 0;
    int i       = 0;
    /******************************************************
        Se end è minore di start, scambio i due valori
     ******************************************************/
        if(start>end){
            int tmp = end;
            end = start;
            start = tmp;
        }else if(start == end)
            end++;
    /******************************************************
        controllo che gli indici end e start, rientrino nel range
        della lunghezza della stringa
    ******************************************************/
        sLen = strLen(str);
        if(sLen<end)
            return subs;
    /******************************************************
        Alloco la memmoria necessaria a contenere la nuova stringa
    ******************************************************/
        subs = (char *)malloc(end-start);
    /******************************************************
        Prendo la sottostringa
    ******************************************************/
        cnt = 0;
        for(i=start; i<end; i++){
            *(subs+cnt) = *(str+i);
            cnt++;
        }
    return subs;
}

             cnt++;
o almeno setta a 0 l'ulimo byte finito il ciclo
*(subs+cnt)='\0';
Assicurati di aver allocato abbastanza byte (lunghezza_substring+1)
Comunque, non chiamare direttamente questa funzione dalla printf(), non
potresti liberare il puntatore allocato all'interno della substring()
es:
char *p;
p=subString("Pippo va a scuola",3,15);
printf("Substring della stringa \"Pippo va a scuola\" = %s\n" , p);
if(p != NULL) free(p);
--
iAN CooG

 wrote:
<cut>
e se passi alla tua subString un indirizzo che sta dopo il terminatore
di stringa non va in errore? :)
Esegui il codice a debug...
Antonio

 potresti liberare il puntatore allocato all'interno della substring()
:)))))))))
Java Viziato.
Questo appunto lo metterò subito sulla mia personalissima FAQ che stilerò
durante gli studi.
1 - rinnovo i ringraziamenti.
2 - Il fatto di aver allocato la memoria e di averla assegnata ad un
puntatore locale alla funzione può crearmi dei problemi uscendo? E' un buon
sistema questo o è meglio procedere per altre vie?
3 - E' bastato allocare la memoria per il terminatore e aggiungerlo alla
fine del ciclo di copia, che tutto è andato. Mi consigli di sostituire
comunque malloc con calloc?
Ciao.

 sostituire comunque malloc con calloc?
A questo punto non serve.
-- 
iAN CooG - ANTIFAN #1 di Simone Crisari
Judgement day the second coming arrives
Before you see the light, you must die!
(South of heaven) (Slayer Gig count: 5)

     "warning: assignment makes pointer from integer without a cast"
Hai incluso l'header stdlib.h? Se no il compilatore (che certamente segue lo 
standard C89) dara' per scontato che il tipo di ritorno sia int, quindi 
pensera' che la malloc ritorni un int e cerchi di assegnarlo a un 
puntatore.
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

 e' uno 0.
Non e' detto.
Molti compilatori definiscono NULL come 0:
#define NULL 0
dove con 0 si intende lo 0 puntatore, non lo 0 numerico.
--------------------------------
Inviato via 
http://usenet.libero.it

 dove con 0 si intende lo 0 puntatore, non lo 0 numerico.
Insomma, se ho capito, in questi compilatori uno 0 viene interpretato
gia' come puntatore e non come intero e quindi il cast non serve,
giusto?
Quindi una questione di parser che lavora in un altra maniera, ma il
risultato mi sembra identico, no? NULL e' cmq un puntatore a 0.
Per curiosita', di che compilatori si tratta?
Lo standard non definisce NULL perche' e' una cosa non definibile a
priori ma deve essere in base all'architettura/piattaforma?


 Per curiosita', di che compilatori si tratta?
Non e' una questione di compilatori, il C tratta NULL sempre a questo modo.


 priori ma deve essere in base all'architettura/piattaforma?
NULL è definibile. Lo standard definisce NULL come zero.
Così come lo standard dice che un puntatore che vale zero è un puntatore 
non valido.

 potresti liberare il puntatore allocato all'interno della substring()
:)))))))))
Java Viziato.
Questo appunto lo metterò subito sulla mia personalissima FAQ che stilerò
durante gli studi.
1 - rinnovo i ringraziamenti.
2 - Il fatto di aver allocato la memoria e di averla assegnata ad un
puntatore locale alla funzione può crearmi dei problemi uscendo? E' un buon
sistema questo o è meglio procedere per altre vie?
3 - E' bastato allocare la memoria per il terminatore e aggiungerlo alla
fine del ciclo di copia, che tutto è andato. Mi consigli di sostituire
comunque malloc con calloc?
Ciao.

 "warning: assignment makes pointer from integer without a cast"
E' perche' non includi la "stdlib.h" che contiene i prototipi di malloc e
calloc.


Ciao Andrea. Ti ringrazio 2 e + volte.
Purtroppo il repost è stato involontario. Il messaggio era rimasto in coda e
non me nero accorto.
Quando ho riacceso oggi il PC è partito da solo.
Ciao.