Frage

Ich versuche, das Problem hier aber ich weiß nicht, warum mein Code funktioniert nicht. Jede Hilfe ist willkommen. EDIT:. Edited Korrektur unten erwähnt, aber es gibt noch eine extra „15“ (fett gedruckt) in der zweiten Zeile des Ausgangs und ich verstehe nicht, wo es herkommt

Meine Ausgabe ist

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");
  }
}
War es hilfreich?

Lösung

Das Problem ist, dass Sie Iterieren alle 15 Zeichen in der Eingabezeichenfolge über, unabhängig von der Länge des Eingangs. Der erste Testfall 11 Zeichen, aber der zweite Fall nur 8. In der zweiten Iteration, sind Sie versehentlich die Verarbeitung der letzten zwei Zeichen aus dem ersten Eingang, die 15 waren.

Um es zu beheben, nur stoppen Ihre Iteration, wenn Sie das NUL-Zeichen 0 getroffen, die durch die Änderung dieser Zeile der Zeichenfolge beendet

for(j=0;j<15;j++){

for(j=0; mystr[j] != 0; j++){

Andere Tipps

Für eine Sache, denke ich, Ihre Vergleiche rückwärts sind. Zum Beispiel sollten Sie "wenn ( 'A' <= mystr [j] && mystr [j] <= 'C')" testen.

Es wäre hilfreich, vielleicht, um eine Funktion zwischen () (mit Entschuldigungen, meint C ist rostig):

bool between(char c, char before, char after) {
    return before <= c && c <= after;
}

so

if ('A' <= mystr[j] && mystr[j] <= 'C')
        printf("2");

wird

if (between(mystr[j], 'A', 'C')
        printf("2");

Es ist im Allgemeinen besser zu nutzen halboffene Bereiche, wo die untere Grenze inklusive ist und die obere Grenze exklusiv. Damit dann wäre das letzte Element eines jeden Tests das erste Element des vorhergehenden Tests, die Sie erkennen, bestimmte Arten von Fehlern leichter helfen könnten.

bedenkt, dass man Dinge in der gleichen Reihenfolge vergleichen möchte. Sprechen Sie heraus diese in einfachem Englisch, bevor das Schreiben von Code. Wenn myLetterCode größer als A.Code && myLetterCode ist weniger als C.Code (es B sein muss!).

halten Sie Ihren Brief auf der linken Seite und dem, was Sie es auf der rechten Seite sind zu vergleichen. Ansonsten sehr es wird verwirrend sehr schnell.

Wäre das nicht mit einer Lookup-Tabelle einfacher sein?

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 ...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top