Vra

Ek probeer die probleem oplos hier maar ek weet nie hoekom my kode nie werk nie.Enige hulp word waardeer.EDIT:Geredigeer om regstelling te maak wat hieronder genoem word, maar daar is steeds 'n ekstra "15" (in vetdruk) op die tweede reël van die uitvoer en ek verstaan ​​nie waar dit vandaan kom nie.

My uitset is

18662658515 555227215

#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");
  }
}
Was dit nuttig?

Oplossing

Die probleem is dat jy oor al 15 karakters in die invoerstring herhaal, ongeag die lengte van die invoer.Die eerste toetsgeval het 11 karakters, maar die tweede geval het slegs 8.In die tweede iterasie verwerk jy per ongeluk die laaste twee karakters van die eerste invoer, wat was 15.

Om dit reg te stel, stop net jou iterasie wanneer jy die NUL-karakter 0 druk, wat die string beëindig deur hierdie reël te verander

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

aan

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

Ander wenke

Vir een ding, ek dink jou vergelykings is agteruit.Byvoorbeeld, jy moet "if ('A' <= mystr[j] && mystr[j] <= 'C')" toets.

Dit sal dalk nuttig wees om 'n funksie te hê tussen() (met verskonings;my C is verroes):

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

so

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

word

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

Dit is oor die algemeen beter om halfoop reekse te gebruik, waar die onderste limiet inklusief en die boonste limiet eksklusief is.Hiermee sou die laaste element van elke toets dan die eerste element van die voorafgaande toets wees, wat jou kan help om sekere soorte foute makliker op te spoor.

dink dat jy dalk dinge in dieselfde volgorde wil vergelyk.Praat dit in gewone Engels voor jy kode skryf.As myLetterCode groter is as A.code && myLetterCode is Minder as C.Code (dit moet B wees!).

hou jou brief aan die linkerkant en die ding waarmee jy dit vergelyk aan die regterkant.Anders raak dit baie vinnig baie verwarrend.

Sal dit nie makliker wees met 'n opsoektabel nie?

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 ...
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top