caio ragazzi sono nuovo del forum e del C..
devo risolvere questo esercizio,
Scrivere una funzione int phoneWords(char *words[], int n, char *map[]) che ritorna il numero di numeri di telefono validi che grazie alla mappa cifre-lettere map possono formare combinazioni alfanumeriche presenti nell'array di n stringhe words. Una sequenza di cifre è un numero di telefono valido se ha lunghezza 10 e non inizia per 00 o per 1.
La mappa map attesa dalla funzione è un array di 10 stringhe tale che:
* map[i] è il puntatore ad una stringa che contiene le lettere (caratteri alfabetici maiuscoli) associate alla cifra i;
* ogni carattere alfabetico maiuscolo appare una e una sola volta in map e nessun'altro carattere appare in map.
In caso gli argomenti di input non soddisfino le precondizioni necessarie alla corretta esecuzione della funzione, questa deve restituire -1.
Le stringhe in words possono contenere anche caratteri non alfanumerici, in questo caso vanno ignorati. Ogni carattere alfabetico (maiuscolo o minuscolo) va fatto corripondere ad una cifra secondo la mappa map e ogni carattere numerico va fatto corrispondere alla cifra corrispondente.
il programma che ho scritto, sicuramente con un codice abbastanza penoso, non da ne warning ne errori e compila bene, ma quando lo eseguo mi da segmentation fault.
codice:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int phonewords(char *words[], int n, char *map[]);
int numCtrl(char *words[], char *map[], int f, char *telefono[], int n);
int carNum(char carattere, char *map[]);
int main()
{
int n;
n = 13;
char *words[n];
words[0] = "lleaseCall";
words[1] = "hello-hello";
words[2] = "ciaociao";
words[3] = "FIRMAMENTO";
words[4] = "TELEFONAMI";
words[5] = "CHIAMA1ORA";
words[6] = "TELEDOMANI";
words[7] = "telefona domani";
words[8] = "ChiamaOra";
words[9] = "0 OK 1 CALL 99";
words[10] = "PLEASE ball";
words[11] = "1Chiamaora";
words[12] = "00OKOKOKOK";
char *map[10];
map[0] = "";
map[1] = "";
map[2] = "ABC";
map[3] = "DEF";
map[4] = "GHI";
map[5] = "JKL";
map[6] = "MNO";
map[7] = "PQRS";
map[8] = "TUV";
map[9] = "WXYZ";
printf("ci sono %d numeri di tel\n", phonewords(words, 13,map));
return 0;
}
int phonewords(char *words[], int n, char *map[])
{
char *telefono[n];
int parole;
int risultato;
risultato = 0;
int c = 0;
int f = 0;
int aux = 0;
int aux2 = 0;
// devo fare una funzione che verifichi la correttezza della map[] che mi viene passata
// controllo che le parole siano di 10 caratteri e che siano alfanumerici
for (parole = 0; parole < n; parole++)
{printf("Parole = %d\n", parole);
if (strlen(words[f]) >= 10)
{
aux = strlen(words[f]);printf("aux = %d\n", aux);
for (c = 0; c < aux; c++)
{
if (isalnum(words[f][c]) != 0) aux2++; printf("aux2 = %d\n", aux2);
}
if (aux2 == 10)
{
if (numCtrl(words, map, f, telefono, n) == 1)
{
risultato++; printf("Risultato = %d\n", risultato);
}
}
}
aux = 0;
aux2 = 0;
f++;printf("f = %d\n", f);
}
return risultato;
}// chiude phonewords
// da qui in poi il codice serve a verificare che le parole passate DI 10 CARATTERI soddisfino la condizione 00 e 1
// definizione delle funzioni usate
int numCtrl(char *words[], char *map[], int f, char *telefono[], int n)
{
char stato;
stato = 'i';
char car;
int e;
int risultato;
int b;
b = 0;
int help;
for (e = 0; e < 10; e++)
{
car = words[f][e]; printf("valore di car %c\n", car);
switch (stato)
{
case 'i': if (car == '1')
{
risultato = 0;
e = 10;
}
else if (car == '0')
{
stato = 'z';
}
else if (isalnum(car) == 0)
{
stato = 'i';
}
else
{ printf("sto passando il carattere ottenuto alla funzione carNum\n");
risultato = 1;
/*telefono[n][b]*/ help = carNum(car, map); printf("help %d \n", help); /* QUA SI VERIFICA L'ERRORE! NON VIENE STAMPATO IL PRINTF, ho temporaneamente messo la variabile int help perchè un altro prob da risolvere è convertire l'int che ricevo dalla funzione in un char da scrivere in telefono[n][b]*/
b++;
stato = 'n';
}
break;
case 'z': if (car == '0')
{
risultato = 0;
e = 10;
}
else if (isalnum(car) == 0)
{
stato = 'z';
}
else
{
risultato = 1;
telefono[n][b] = '0';
b++;
telefono[n][b] = carNum(car, map);
b++;
stato = 'n';
}
break;
case 'n':
telefono[n][b] = (char)carNum(car, map);
b++;
break;
}
}
return risultato;
}
int carNum(char carattere, char *map[])
{
int conta;
conta = 0;
carattere = (char)toupper(carattere);
printf("Ho reso maiuscolo il carattere %c\n", carattere);
do
{printf("map in 0 = %c\n", map[conta][0]);
if(strchr(map[conta], carattere) == NULL) conta++;
} while (strchr(map[conta], carattere) == NULL);
printf("conta = %d\n", conta);
return conta;
}
l'errore si verifica appena terminata la funzione carNum richiamata nell'ultimo else del case 'i' dello switch...
Se qualcuno ha una vaga idea di cosa ci sia di sbagliato sarei molto felice di saperlo..