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.
l'errore si verifica appena terminata la funzione carNum richiamata nell'ultimo else del case 'i' dello switch...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; }
Se qualcuno ha una vaga idea di cosa ci sia di sbagliato sarei molto felice di saperlo..

Rispondi quotando