PDA

Visualizza la versione completa : [C] Stampa di puntatori a char


anubi0086
30-11-2011, 16:51
Buona sera... inanzi tutto ringrazio chiunque possa essermi d'aiuto..
Dunque il problema questo
Dovrei inserire in una array di char delle stringhe e stamparle, ma purtroppo con ci riesco..

char *word[20];
int main(void){
int i; int j;

printf("Inizio\n");
printf("Inserisci una stringa\n");
for(i=0;i<5;i++){
scanf("%s",word);
}
printf("hai inserito:\n");
for (i=0;i<5; i++){
printf("\n");
for (j=0; word[i][j]='\0';j++){
printf("%c",word[i][j]);
}
}
system("PAUSE");
return 0; }
il problema mi sorge al momento della stampa....potreste aiutarmi cortesemente... grazie

LeleFT
30-11-2011, 16:57
Quale problema sorge al momento della stampa? Ricorda che necessario fornire sempre il maggior numero di dettagli: messaggi di errore, comportamenti inattesi, risultati errati, ecc. senza dover delegare agli altri la "scoperta" dei propri errori che gi si conosco.


Ciao. :ciauz:

anubi0086
30-11-2011, 17:18
Originariamente inviato da LeleFT
Quale problema sorge al momento della stampa? Ricorda che necessario fornire sempre il maggior numero di dettagli: messaggi di errore, comportamenti inattesi, risultati errati, ecc. senza dover delegare agli altri la "scoperta" dei propri errori che gi si conosco.


Ciao. :ciauz:

purtroppo non ho scritto l'errore perch il programma crasha senza dare un output specifico

LeleFT
30-11-2011, 17:24
Originariamente inviato da anubi0086
purtroppo non ho scritto l'errore perch il programma crasha senza dare un output specifico

Questo, ad esempio, il tipo di informazione che avresti dovuto dare subito.

Per prima cosa non hai dimensionato l'array di "stringhe" e questa senza dubbio la causa del crash.

Ad ogni modo, rivedrei questa parte di codice che non ha molto senso:


for(i=0;i<5;i++){
scanf("%s",word);
}


In pratica leggi 5 volte una stringa da tastiera e la butti sempre nello stesso posto... ma quel posto non un posto adatto a contenere una stringa...

Poi c' da rivedere anche la condizione di uscita del for pi interno nella stampa... in quel modo va avanti finch il carattere '\0', quindi si ferma subito (essendo che, almeno, il primo dovrebbe essere diverso).


Ciao. :ciauz:

anubi0086
30-11-2011, 17:43
Originariamente inviato da anubi0086
purtroppo non ho scritto l'errore perch il programma crasha senza dare un output specifico

ho apportato la modifica alla dimensione e indicizzato l'inserimento nel array in questo modo :



int main(void){
char *word[ELEM][ELEM];
int i; int j;
printf("Inizio\n");
printf("Inserisci una stringa\n");
for(i=0;i<5;i++){
scanf("%s",word[i]);
}
printf("hai inserito:\n");
for (i=0;i<5; i++){
printf("\n");
for (j=0; word[i][j]='\0';j++){
printf("%c",word[i][j]);
}
}
system("PAUSE");
return 0;
} ma ora quando faccio la stampa mi esce un blocco vuoto help :dh:

HO RISOLTOOOO :D :D

LeleFT
30-11-2011, 17:48
Rileggi la parte finale del mio post precedente: la condizione del for interno (quello che scorre sull'indice "j") va rivista... al contrario. Devi proseguire finch NON incontri il carattere '\0'.


Ciao. :ciauz:

anubi0086
30-11-2011, 17:53
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include<ctype.h>
#define ELEM 20

int main(void){
char *word[ELEM][ELEM];
int i; int j;

for(i=0;i<ELEM;i++){
word[i][0]='\0';
}

printf("Inizio\n");
printf("Inserisci una stringa\n");
for(i=0;i<5;i++){

scanf("%s",word[i]);
}
for(i=0;i<5;i++){
if(word[i][0]!='\0')
printf("%s\n", word[i]);
}
system("PAUSE");
return 0;
}

ramy89
30-11-2011, 19:17
Anche se come si dice in gergo "funziona" non vuol dire che sia corretto.
La memoria va allocata !


char *word[ELEM][ELEM];

Qui hai una matrice di puntatori.
Ma sono tutti puntatori che contengono solo un indirizzo,non ci hai allocato memoria.
Con questa matrice potresti prendere su (allocando spazio) ELEM x ELEM stringhe:


for(i=0;i<ELEM;i++)
for(j=0;j<ELEM;j++)
{
word[i][j]=(char*)calloc(100,sizeof(char));
fgets(word[i][j],100,stdin);
}
for(i=0;i<ELEM;i++)
for(j=0;j<ELEM;j++)
puts(word[i][j]);

Oppure sostiusuisci la riga con:


char word[ELEM][ELEM];

E prendi su le righe con scanf anche se te lo sconsiglio,meglio usare fgets.

anubi0086
30-11-2011, 20:57
Originariamente inviato da ramy89
Anche se come si dice in gergo "funziona" non vuol dire che sia corretto.
La memoria va allocata !


char *word[ELEM][ELEM];

Qui hai una matrice di puntatori.
Ma sono tutti puntatori che contengono solo un indirizzo,non ci hai allocato memoria.
Con questa matrice potresti prendere su (allocando spazio) ELEM x ELEM stringhe:


for(i=0;i<ELEM;i++)
for(j=0;j<ELEM;j++)
{
word[i][j]=(char*)calloc(100,sizeof(char));
fgets(word[i][j],100,stdin);
}
for(i=0;i<ELEM;i++)
for(j=0;j<ELEM;j++)
puts(word[i][j]);

Oppure sostiusuisci la riga con:


char word[ELEM][ELEM];

E prendi su le righe con scanf anche se te lo sconsiglio,meglio usare fgets.

grazie per l'esaustiva risposta

anubi0086
30-11-2011, 21:06
avrei un altro dubbio volendo passare il tutto ad una funzione ho provato a scrivere cosi
void leggi(char*[],int );
int main(void){
char *word[ELEM][ELEM];
int i;
int j;
int l;
for(i=0;i<ELEM;i++){
word[i][0]='\0';
}
printf("Inizio\n");
printf("Quante parole vuoi inserire?");
scanf("%d",&l);
leggi(word,l);

system("PAUSE");
return 0; }

void leggi(char *parole[],int size){
int i; printf("Inserisci una stringa\n");
for(i=0;i<size;i++){
scanf("%s",parole[i]); } }
solo che mi crasha appena inserisco il primo elemento...potreste aiutarmi
ed in pi mi da questo [Warning] passing arg 1 of `leggi' from incompatible pointer type

Loading