|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Torino
Messaggi: 722
|
Memorizzare stringhe in una matrice
Ho ricevuto all'università una esercitazione che non riesco proprio a fare, o perlomeno avrei una tattica ma vorrei sapere voi cosa ne pensate e se è fattibile. Allora io ho un documento come questo:
Quote:
Avevo pensato a assegnare un puntatore a ogni parola imagazzinata e poi mettere il puntatore nella matrice,e ho provato a fare questo programma, ma non gira Codice:
#include <stdio.h>
#include <stdlib.h>
#define MAX 256
FILE *ptr1;
void riempi_matrice(char **matr,int r,int c);
int main()
{
FILE *ptr2;
char s1[MAX],s2[MAX];
int r,c;
char **mat;
//prendo il nome del file in lettura
printf("Salve utente, inserisci il nome del file in lettura-->");
scanf("%s",s1);
while((ptr1=fopen(s1,"r"))==NULL){
printf("\nNome file sbagliato, reinserire-->");
scanf("%s",s1);
}
printf("\nOra inserisci il nome del file in scrittura-->");
scanf("%s",s2);
ptr2=fopen(s2,"w");
//prendo i due numeri a inizio file
fscanf(ptr1,"%d %d",&r,&c);
riempi_matrice(mat,r,c);
return 0;
}
void riempi_matrice(char **matr,int r,int c){
int i,j;
char *parola,temp; //parola è un puntatore, temp una stringa di appoggio
//alloco dinamicamente la matrice
matr=(char **)calloc(r,sizeof(char *));
for(i=0;i<c;i++){
matr[i]=(char *)calloc(c,sizeof(char));
}
for(i=0;i<r;i++){
for(j=0;j<c;j++){
fscanf(ptr1,"%s",&temp);
parola=&temp;
matr[i][j]= *parola;
}
}
//cicli per la stampa della matrice
for(i=0;i<r;i++){
for(j=0;j<c;j++){
parola=&matr[i][j];
temp=*parola;
printf("%s\n",);
}
}
return;
}
__________________
CPU: Intel core i7 920 Zalman 9900 cooled - Case:CM COSMOS S - MOBO: Asus P6T - RAM: 3X2Gb DDR3 Corsair XMS3 - VGA: GTX295 - HDD: WD 1TB - ALI: CM real power 850W - Monitor: HP W2558HC Trattative--> ~Bl4k, S5otto, Frytz, gaon174 |
|
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Dec 2007
Messaggi: 121
|
dunque, nel primo ciclo for di riempi_matrice() non la condizione non dovrebbe essere i < r?
e poi temp non è una stringa ma un carattere singolo, una stringa è un array di caratteri. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Torino
Messaggi: 722
|
Si è vero adesso ho corretto, ma come potrei fare a memorizzare una stringa su un puntatore????
__________________
CPU: Intel core i7 920 Zalman 9900 cooled - Case:CM COSMOS S - MOBO: Asus P6T - RAM: 3X2Gb DDR3 Corsair XMS3 - VGA: GTX295 - HDD: WD 1TB - ALI: CM real power 850W - Monitor: HP W2558HC Trattative--> ~Bl4k, S5otto, Frytz, gaon174 |
|
|
|
|
|
#4 | |
|
Member
Iscritto dal: Dec 2007
Messaggi: 121
|
Quote:
Codice:
char *str = (char *)malloc(256); //creo una stringa da 256 caratteri che viene puntata da str fscanf(file, "%s", str); //non metto & perchè str è un puntatore mat[i][j] = str; //il puntatore mat[i][j] ora punta alla stringa creata |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Torino
Messaggi: 722
|
Quote:
__________________
CPU: Intel core i7 920 Zalman 9900 cooled - Case:CM COSMOS S - MOBO: Asus P6T - RAM: 3X2Gb DDR3 Corsair XMS3 - VGA: GTX295 - HDD: WD 1TB - ALI: CM real power 850W - Monitor: HP W2558HC Trattative--> ~Bl4k, S5otto, Frytz, gaon174 |
|
|
|
|
|
|
#6 | |
|
Member
Iscritto dal: Dec 2007
Messaggi: 121
|
Quote:
quando sovrascrivi il puntatore, str non punterà più alla stringa di prima ma alla nuova stringa creata. volendo potresti ottimizzare il tuo codice eliminando la stringa temporanea utilizzando malloc() direttamente su mat[i][j], però non so se il tuo esercizio ti obblighi ad usare un puntatore temporaneo. mi sento di dirti di fare piu domande che puoi se non ti è chiaro qualcosa riguardo i puntatori. sono una risorsa chiave del C. Una volta che capisci come funzionano ti risolvono tantissimi problemi e te ne innamori |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Torino
Messaggi: 722
|
Quote:
Ti faccio solo più un'ultima domandina, io ho adattato il codice così Codice:
#include <stdio.h>
#include <stdlib.h>
#define MAX 256
FILE *ptr1;
void riempi_matrice(char **matr,int r,int c);
int main()
{
FILE *ptr2;
char s1[MAX],s2[MAX];
int r,c;
char **mat;
printf("Salve utente, inserisci il nome del file in lettura-->");
scanf("%s",s1);
while((ptr1=fopen(s1,"r"))==NULL){
printf("\nNome file sbagliato, reinserire-->");
scanf("%s",s1);
}
printf("\nOra inserisci il nome del file in scrittura-->");
scanf("%s",s2);
ptr2=fopen(s2,"w");
fscanf(ptr1,"%d %d",&r,&c);
riempi_matrice(mat,r,c);
return 0;
}
void riempi_matrice(char **matr,int r,int c){
int i,j;
char *parola;
parola=(char *)malloc(256*sizeof(char));
matr=(char **)calloc(r,sizeof(char *));
for(i=0;i<r;i++){
matr[i]=(char *)calloc(c,sizeof(char));
}
for(i=0;i<r;i++){
for(j=0;j<c;j++){
fscanf(ptr1,"%s",parola);
//QUI MI DA' UN WARNING
matr[i][j]=parola;
//QUI MI DA' UN ALTRO WARNING,è una printf di controllo
printf("%s\n",matr[i][j]);
}
}
return;
}
__________________
CPU: Intel core i7 920 Zalman 9900 cooled - Case:CM COSMOS S - MOBO: Asus P6T - RAM: 3X2Gb DDR3 Corsair XMS3 - VGA: GTX295 - HDD: WD 1TB - ALI: CM real power 850W - Monitor: HP W2558HC Trattative--> ~Bl4k, S5otto, Frytz, gaon174 |
|
|
|
|
|
|
#8 | |
|
Member
Iscritto dal: Dec 2007
Messaggi: 121
|
Quote:
prova a debuggare, quali sono i valori di i e j al momento del crash? tra due minuti scappo che sono in ritardo, se non risponde nessun'altro lo faccio io quando torno |
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Dec 2007
Messaggi: 121
|
ehi ho notato un'altra cosa.
parola=(char *)malloc(256*sizeof(char)); lo devi mettere nel ciclo, prima di fscanf, altrimenti avrai una matrice di parole uguali EDIT: in oltre questo ciclo: Codice:
for(i=0;i<r;i++){
matr[i]=(char *)calloc(c,sizeof(char));
}
in oltre, se allochi memoria nel programma (tipo usando malloc()) è cosa buona e giusta liberarla a fine programma con la funzione free() o simili (ma se non te la senti ancora, non complicarti la vita Ultima modifica di IceCoder : 01-10-2008 alle 18:53. |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Torino
Messaggi: 722
|
Quote:
Per la seconda cosa io devo per forza usare una matrice per memorizzare le parole, è obbligatorio per il programma
__________________
CPU: Intel core i7 920 Zalman 9900 cooled - Case:CM COSMOS S - MOBO: Asus P6T - RAM: 3X2Gb DDR3 Corsair XMS3 - VGA: GTX295 - HDD: WD 1TB - ALI: CM real power 850W - Monitor: HP W2558HC Trattative--> ~Bl4k, S5otto, Frytz, gaon174 Ultima modifica di hasmet : 01-10-2008 alle 19:37. |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Una variabile di tipo
char** Equivale ad una matrice bidimensionale la cui cella e' un char singolo (Oppure un'array la cui cella e' una stringa, ovvero un char*) Per una matrice bidimensionale la cui cella sia una stringa, hai bisogno di un char***
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jun 2007
Messaggi: 1232
|
Ragazzi scusate ma creare una matrice di stringhe ??
__________________
Cpu: Amd 64 X2 5200+ - Mobo:M2N32SLI DELUXE - Ram: Corsair xms2 800 mhz kit 4gb - SK Video: Gaiward GTS250 - Ali : Enermax Liberty 500 Wat - Mast DVD: 2 Nec AD-5170A - Case : Thermaltake Armor+ - Dissipatore: Thermaltake V1 Notebook: Sony Vaio VGN-Fe21M-Pda: Htc Diamond |Il mio sito|Flickr| Stanco del solito forum? Vieni a parlare di fotografia su Fotoni |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jun 2007
Messaggi: 1232
|
mi rispondo da solo . Non mi ero accorto che si parlava di C.
__________________
Cpu: Amd 64 X2 5200+ - Mobo:M2N32SLI DELUXE - Ram: Corsair xms2 800 mhz kit 4gb - SK Video: Gaiward GTS250 - Ali : Enermax Liberty 500 Wat - Mast DVD: 2 Nec AD-5170A - Case : Thermaltake Armor+ - Dissipatore: Thermaltake V1 Notebook: Sony Vaio VGN-Fe21M-Pda: Htc Diamond |Il mio sito|Flickr| Stanco del solito forum? Vieni a parlare di fotografia su Fotoni |
|
|
|
|
|
#14 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Forse ti può essere utile un esempio di allocazione/deallocazione dinamica della matrice tridimensionale:
Codice:
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main()
{
char ***myArray;
int i, j;
int righe = 2, colonne = 2, len_string = 32;
// Allochiamo
myArray = (char***)malloc(righe*sizeof(char**));
if( NULL == myArray )
{
printf("Errore nell'allocazione della memoria.\n");
return -1;
}
for ( i = 0; i < righe; ++i )
{
myArray[i] = (char**)malloc(colonne*sizeof(char*));
if( NULL == myArray[i] )
{
printf("Errore nell'allocazione della memoria.\n");
return -1;
}
for( j = 0; j < colonne; ++j)
{
myArray[i][j] = (char*)malloc(len_string);
if( NULL == myArray[i][j] )
{
printf("Errore nell'allocazione della memoria.\n");
return -1;
}
}
}
strcpy(myArray[0][0], "Pippo");
strcpy(myArray[0][1], "Topolino");
strcpy(myArray[1][0], "Paperino");
strcpy(myArray[1][1], "Pluto");
printf("\n");
for( i = 0; i < righe; ++i)
{
for(int j = 0; j < colonne; ++j)
{
printf("myArray[%d][%d] -> %s\n", i, j, myArray[i][j]);
}
}
printf("\n");
// Deallochiamo
for( i = 0; i < righe; ++i)
{
for( j = 0; j < colonne; ++j)
{
free(myArray[i][j]);
}
free(myArray[i]);
}
free(myArray);
return 0;
}
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Un po' arrugginito di C speravo di non aver preso una cantonata. [OT] Ciao Vincenzo. Quanto tempo... [/OT]
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#16 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Ohé Gugo,
ciao P.S. Quando ti decidi a postare un altro bel contest? |
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Parecchi terremoti in questi giorni, ma penso che si sia vicini alla luce.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Torino
Messaggi: 722
|
Quote:
__________________
CPU: Intel core i7 920 Zalman 9900 cooled - Case:CM COSMOS S - MOBO: Asus P6T - RAM: 3X2Gb DDR3 Corsair XMS3 - VGA: GTX295 - HDD: WD 1TB - ALI: CM real power 850W - Monitor: HP W2558HC Trattative--> ~Bl4k, S5otto, Frytz, gaon174 |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:05.










- HDD: WD 1TB - ALI: CM real power 850W - Monitor: HP W2558HC 









