Newsgroup: it.comp.lang.c
Titolo: puntatori

Ciao a tutti,
sto imparando a programmare in C e non mi è chiaro come funzionino
esattamente i puntatori.
Io ho questo programmino:
-------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main(int argc, char *argv[]) {
    char *str1,*str2;
    printf("Inserisci la prima stringa\n");
        scanf("%s",&str1);
    printf("Inserisci la seconda stringa\n");
        scanf("%s",&str2);
    printf("La prima stringa e':\n%s\n",str1);
}
--------------------------------
ora..
inserendo due stringhe di 3 caratteri il programma funziona
ad esempio se inserisco "qwe" e "asd" mi stampa "qwe"
se invece inserisco due stringhe di 4 caratteri me le unisce
ad esempio se inserisco "qwer" e "asdf" mi stampa "qwerasdf"
come mai?!?
in pratica vorrei inserire 2 stringhe di lunghezza casuale e poi
concatenarle in una terza..
per la concatenazione pensavo, dopo aver inserito le prime due stringhe,
di calcolarmi la loro lunghezza, e creare la string3 con una malloc
grande quando sizeof(string1)+sizeof(string2)+1. il problema è che mi
blocco all'inserimento della stringa2.. 
grazie

 blocco all'inserimento della stringa2.. 
Non mi pare di aver visto l'allocazione di memoria per queste prime 2
stringhe. O fai malloc anche prima o le dichiari di lunghezza n e cerchi
di stare sotto n-1.
-- 
Poochie©

 di stare sotto n-1.
Ma quindi devo per forza allocare una dimensione fissa per la stringa?
Non c'è nessun modo per fare in modo che si crei una stringa coi
caratteri che gli inserisco da tastiera senza limitare il numero di
caratteri?
Qualcosa che ad esempio mi crei una stringa di 10 caratteri se gliene
inserisco 10, e che me ne crei una di 500 se gliene inserisco 500?
Grazie

 caratteri?
Non c'e` nessuna funzione standard che lo faccia, ma e` abbastanza
semplice crearla. In pseudocodice:
#define STR_BLOCK 100
char *read_string(void) {
        char *str = NULL;
        char *tmp;
        size_t size = 1;
        do {
                size += STR_BLOCK;
 
                tmp = realloc(str, size);
                if (!tmp) {
                        free(str);
                        return NULL;
                }
 
                leggi STR_BLOCK caratteri
 
                if (trovato newline)
                        return str;
        } while(1)
 
}
Ovviamente serve qualche controllo in piu`, specie nel caso venga letto
un blocco di caratteri con il newline in mezzo. La cosa piu` banale che
puoi fare (ma pessima dal punto di vista delle prestazioni) e` questa:
char *read_string(void) {
        char *str = NULL;
        char *tmp;
        size_t size = 1;
        int c, i = 0;
        do {
                c = getchar();
                if (c == EOF) {
                        if (str)
                                str[i] = '\0';
                        return str;
                }
 
                size++;
                tmp = realloc(str, size);
                if (!tmp) {
                        free(str);
                        return NULL;
                }
 
                str[i++] = c;
        } while(c != '\n');
        str[i] = '\0';
        return str;
}
(Non compilata, per darti un'idea)
Luca
-- 
Home: 
http://kronoz.cjb.net
Sono un mirabile incrocio tra Tarzan e Giacomo Leopardi.
In me convivono tutte le doti intelluttuali di Tarzan e
tutta la prestanza fisica di Giacomo Leopardi.
A. Borsani

 [...]
grazie mille.. ora me la guardo/studio