Dichiarazioni if e uguaglianza
-
03-07-2019 - |
Domanda
Sto cercando di risolvere il problema qui ma non so perché il mio codice non funziona. Qualsiasi aiuto è apprezzato. EDIT: modificato per apportare le correzioni di seguito indicate, ma c'è ancora un & Quot; 15 & Quot; (in grassetto) sulla seconda riga dell'output e non capisco da dove provenga.
Il mio output è
18662658515 5552272 15
#include <stdlib.h>
#include <stdio.h>
int main(void){
int n;
int j;
scanf("%d\n", &n);
int i = 0;
char mystr[15];
for(;i<n;i++){
fgets(mystr,15,stdin);
for(j=0;j<15;j++){
if(isdigit(mystr[j])){
printf("%c", mystr[j]);
continue;
}
if ('A' <= mystr[j] && mystr[j] <= 'C')
printf("2");
if ('D' <= mystr[j] && mystr[j] <= 'F')
printf("3");
if ('G' <= mystr[j] && mystr[j] <= 'I')
printf("4");
if ('J' <= mystr[j] && mystr[j] <= 'L')
printf("5");
if ('M' <= mystr[j] && mystr[j] <= 'O')
printf("6");
if ('P' <= mystr[j] && mystr[j] <= 'S')
printf("7");
if ('T' <= mystr[j] && mystr[j] <= 'V')
printf("8");
if ('W' <= mystr[j] && mystr[j] <= 'Z')
printf("9");
}
printf("\n");
}
}
Soluzione
Il problema è che stai iterando su tutti e 15 i caratteri nella stringa di input, indipendentemente dalla lunghezza dell'input. Il primo caso di test ha 11 caratteri, ma il secondo caso ha solo 8. Nella seconda iterazione, stai accidentalmente elaborando gli ultimi due caratteri dal primo input, che erano 15
.
Per risolverlo, basta interrompere l'iterazione quando si preme il carattere NUL 0, che termina la stringa modificando questa riga
for(j=0;j<15;j++){
a
for(j=0; mystr[j] != 0; j++){
Altri suggerimenti
Per prima cosa, penso che i tuoi confronti siano all'indietro. Ad esempio, dovresti testare & Quot; if ('A' & Lt; = mystr [j] & Amp; & Amp; mystr [j] & Lt; = 'C' ) quot &;.
Sarebbe utile, forse, avere una funzione tra () (con scuse; la mia C è arrugginita):
bool between(char c, char before, char after) {
return before <= c && c <= after;
}
così
if ('A' <= mystr[j] && mystr[j] <= 'C')
printf("2");
diventa
if (between(mystr[j], 'A', 'C')
printf("2");
In genere è preferibile utilizzare intervalli semiaperti, in cui il limite inferiore è inclusivo e il limite superiore esclusivo. Con questo, quindi, l'ultimo elemento di ogni test sarebbe il primo elemento del test precedente, che potrebbe aiutarti a rilevare più facilmente alcuni tipi di bug.
considera che potresti voler confrontare le cose nello stesso ordine. Parla in un inglese semplice prima di scrivere il codice. Se myLetterCode è maggiore di A.code & Amp; & Amp; myLetterCode è inferiore a C.Code (deve essere B!).
mantieni la tua lettera a sinistra e la cosa con cui la stai confrontando a destra. Altrimenti diventa molto confuso molto velocemente.
Non sarebbe più facile con una tabella di ricerca?
int numbers[] = { 2, 2, 2, 3, 3, 3,
4, 4, 4, 5, 5, 5, 6, 6, 6,
7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9};
... cut ...
if (isdigit (mystr[j]))
printf ("%c", mystr[j]);
else
printf ("%d", numbers[mystr[j] - 'A']);
... cut ...