Newsgroup: it.comp.lang.c
Titolo: Array di caratteri a 2 dimensioni

Ciao, avrei l'esigenza di creare un programma che ordina delle parole
presenti in un array a 2 dimensioni in cui per ogni riga c'è una parola.
Le parole verrebbero ordinate con bubble sort e strcmp(). Il problema è
che non so come fargli capire che deve mettere le parole usando tutte le
celle disponibili sulla riga...
Riporto il sorgente con un pò di commenti qui sotto. Grazie 1000 per
l'aiuto.
<code>
/* programma che ordina in ordine alfabetico un array bidimensionale con tante parole*/
#include <stdio.h>
#include <string.h>
#define RIGHE 200
#define COLONNE 200
int main ()
{
	char dizionario[COLONNE][RIGHE];
	int num_word, i, valore, j;
	char stringa;
 
	/* controlla che nell'array non ci siano più parole che spazi disponibili */
 
	while (1)
	{
		printf("Quante parole vuoi inserire?\t");
		scanf("%d",&num_word);
		if (num_word < RIGHE)
			break;
	}
 
	/* Inserisce le parole nell'array, ma come cavolo faccio a fargli capire
	che il numero di roba che va nella colonna dipende da quello che 
	inserisce l'utente mentre il numero di righe è la quantità di parole?*/
 
	for (i = 0; i < num_word; i++)
	{
		for (j = 0; j != '\0'; i++)
		{
			printf("Inserisci la %d parola:\t",i+1);
			scanf("%s",&stringa);
			dizionario[][j] = gets(stringa);
	}
 
	/* stampa l'array*/
 
	for (i = 0; i < num_word; i++)
		printf("%s\n",dizionario[][i]);
 
	/* ordina l'array. Ed ho lo stesso problema di prima...*/
 
	for (i = 0; i < num_word; i++)
	{
		for (j = 0; j < num_word+1; j++)
		{
 
			valore = strcmp(dizionario[][i],dizionario[][j]);
			if (valore > 0)
			{
				stringa_aus = dizionario[][i];
				dizionario[][i] = dizionario[][j];
				dizionario[][j] = stringa_aus;
 
			}
		}
	}
 
	/* scrive array ordinato */
 
	for (i = 0; i < num_word; i++)
		printf("%s\n",dizionario[][i]);
 
	return 0;
}
</code>		
-- 
e-mail: dialtone#/N0SPAM/#@
aruba.it
     |Non vorrei piacere a tutti
togliere #N0SPAM# per inviare           |Avrei meno stima di me stesso
Powered by Debian Woody                 |Se piacessi a certa gente
On Linux 2.4.17 - WM 0.80.0             |

 char dizionario[COLONNE][RIGHE];
e' un errore classico: in C una stringa e' un array di per se',
quindi devi definire il tutto come
char* dizionario[COLONNE][RIGHE];
in cui ogni elemento e' un puntatore ad una stringa, variamente allocata
ti consiglio di ripassarle, perche' anche piu' oltre nel codice usi 
 char stringa;
invece di 
 char* stringa;
o di 
 #define DIMENSIONE_MASSIMA 1024
 char string[DIMENSIONE_MASSIMA];

 in cui ogni elemento e' un puntatore ad una stringa, variamente allocata
C'è un modo per non usare i puntatori?
Mi sono accorto anche che nel codice che ho postato ci sono 2 o 3 errori
ma la sostanza è quella in ogni caso...


ma la sostanza è quella in ogni caso...
Si, ma non credo venga bene :)
Se non usi il puntatore il tuo array multidimensionale deve passare da
2 a 3 dimensioni... in pratica ti serve una matrice di array di
caratteri (o stringhe se preferisci), di dimensione fissa.
Se ti serve la dimensione variabile per le stringhe allora puoi solo
usare i puntatori.
-- 
Mox

 usare i puntatori.
Quindi... Devo dire all'utente di inserire obbligatoriamente N parole
formate da M caratteri?
PS: Un parere tecnico: meglio usare gets() e assegnarla direttamente
all'array o getchar() e assegnare un carattere per volta all'array in
questo caso?
E soprattutto una volta che gli ho detto che la dimensione è fissa cosa
piazzo in dizionario[??][i]? Grazie 1000


                printf("%s\n",dizionario[][i]);
for (i = 0; i < num_word; i++)
	printf("%s\n", dizionario[i]);
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Se alla sera, dopo una strepitosa vittoria, guardandoti allo
specchio dovessi notare un secondo paio di palle, che il tuo 
cuore non si riempia d'orgoglio, perche` vuol dire che ti 
stanno inculando -- Saggio Cinese

 questo caso?
*MAI*  usare gets. Non  ha il  controllo  sulla lunghezza  del buffer  e
rischi overflow:
char foo[10];
gets(foo);
In questo  caso gets si  ferma quando  incontra il newline,  ma potrebbe
memorizzare anche piu`  di 9 caratteri, uscendo dallo  spazio di memoria
allocato. Tra parentesi  il gcc  dovrebbe insultarti  abbondantemente se
provi ad usare gets.
char foo[10];
fgets(foo, sizeof(foo), stdin);
In questo caso la lettura avviene  fino al newline purche` non si superi
il limite  di (sizeof(foo)  - 1)  caratteri: in  questo caso  la stringa
viene troncata.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Il piu` bel momento dell'amore e` quando ci si illude che duri
per sempre; il piu` brutto, quando ci si accorge che dura
da troppo.

 	printf("%s\n", dizionario[i]);
stesso errore...
 
Ho capito... Il prof. ha dato i numeri e chi ha affibiato un compito un
pò troppo al di sopra di quello che ci aveva spiegato... Oppure noi
dovevamo ordinare soltanto delle lettere e non delle intere parole anche
se in questo caso mi sorge il dubbio del motivo per cui ci abbia
spiegato strcmp... Va be. Grazie 1000 ciao


spiegato strcmp... Va be. Grazie 1000 ciao
Se il compito fosse esattamente cosa ti ha spiegato valuterebbe solo
se dormivi o no durante le lezioni :)  Non se avevi imparato il C.
-- 
Mox

formate da M caratteri?
No, parole di al MASSIMO M caratteri, se no hai un buffer overflow.
Visto che la stringa deve avere questo formato:
"tanti caratteri quanti ti pare ma terminati da un \0"
(la sequenza \0 occupa lo spazio di un singolo char, non di 2, ma non
avevo un altro modo sintetico di renderlo).
Tu puoi usare lo spazio per 100 char per immagazzinarne 10, basta che
ci sia il '\0' alla fine. Ovviamente non conviene una cosa simile,
perche' sprechi spazio e come insegnano i problemi di ricerca non c'e'
mai abbastanza memoria :)
-- 
Mox

talmente tanto che hai fatto voto di non usarli mai piu'? :)
No, la questione è che Dialtone è un newbie del C (senza offesa
ovviamente) e non conosce ancora l'utilizzo dei puntatori (nel corso
che sta seguendo a scuola non penso ci siano ancora arrivati)
Cmq se vuole gli ho prestato il K&R2 e quindi può sopperire leggendo
il capitolo sui puntatori :)))
--
Lawrence "Rhymes" Oluyede
rhy...@myself.com

 se dormivi o no durante le lezioni :)  Non se avevi imparato il C.
Questo è ok, però se a casa mi tocca ricercare delle funzioni quando
quelle che abbiamo fatto le ha appena accennate allora me lo imparo da
solo a casa che faccio prima...
