Avatar billede nejmann Nybegynder
04. november 2003 - 20:57 Der er 16 kommentarer og
1 løsning

Ændre rækkefølgen i - ja hvad er nemmest?

Hej!

Jeg sidder med et lille problem... jeg skal have formatteret et nummer f.eks. 72536283 således at det bliver delt op i talpar (72, 53, 62 og 83) og derefter  bliver swap'et til henholdsvis 27, 35, 26 og 38 - de to tal i hvert talpar bytter plads. Hvordan gør jeg lige det nemmest?

På forhånd tak!
Avatar billede soreno Praktikant
04. november 2003 - 21:07 #1
Er der altid et lige antal cifre ?
Skal det nye tal sættes sammen til en int ?
Hvor store tal drejer det sig om ?
Avatar billede arne_v Ekspert
04. november 2003 - 21:11 #2
Forslag:

int i;
int v = 72536283;
char s[17];
sprintf(s,"%d",v);
for(i=0;i<strlen(s);i=i+2)
{
  if(i>0) printf(",");
  printf("%c%c",s[i+1],s[i]);
}
Avatar billede nejmann Nybegynder
04. november 2003 - 21:12 #3
Nej, det er ikke altid et lige antal cifre. I de tilfælde det er ulige skal der foran det sidste cifre sættes et f. Ex. 546378942, her bliver talparrene (swap'et) 45, 36, 87, 49 og f2.
Avatar billede arne_v Ekspert
04. november 2003 - 21:17 #4
nt i;
int v = 72536283;
char s[17];
sprintf(s,"%d",v);
if((strlen(s)%2)==1) strcat(s,"f");
for(i=0;i<strlen(s);i=i+2)
{
  if(i>0) printf(",");
  printf("%c%c",s[i+1],s[i]);
}
Avatar billede arne_v Ekspert
04. november 2003 - 21:21 #5
Kode:

#include <stdio.h>
#include <string.h>

void test(int v)
{
  int i;
  char s[17];
  sprintf(s,"%d",v);
  if((strlen(s)%2)==1) strcat(s,"f");
  for(i=0;i<strlen(s);i=i+2)
  {
    if(i>0) printf(",");
    printf("%c%c",s[i+1],s[i]);
  }
  printf("\n");
}

int main()
{
  test(72536283);
  test(546378942);
  return 0;
}

Output:

27,35,26,38
45,36,87,49,f2
Avatar billede nejmann Nybegynder
04. november 2003 - 21:25 #6
Det ser ganske fornuftigt ud! Nu har jeg aldrig været den store bruger af printf... kan man tillade sig at få en kort forklaring på hvad den lige gør i dette eksempel?

Men siger mange tak allerede nu!!
Avatar billede arne_v Ekspert
04. november 2003 - 21:29 #7
sprintf(s,"%d",v);  // konverter fra tal til streng

if(i>0) printf(",");  // printer komma før alle tal undtagen det første

printf("%c%c",s[i+1],s[i]);  // printer de 2 tegn

printf("\n");  // laver linieskift
Avatar billede arne_v Ekspert
04. november 2003 - 21:29 #8
Hvis hastighed er ekstremt kritisk, så kan sprintf kaldet erstattes af noget
special kode.
Avatar billede nejmann Nybegynder
04. november 2003 - 21:37 #9
Merci! Hvis jeg nu skal have det ind i et byte array - har du lige en hurtig løsning... min hjerne vil åbenbart ikke i dag
Avatar billede arne_v Ekspert
04. november 2003 - 21:41 #10
Hvordan ind i et byte array ?

Skal 27,35,26,38 være 2 7 3 5 2 6 3 8 eller 27 35 26 38 eller
0x27 0x35 0x26 0x38 ?
Avatar billede nejmann Nybegynder
04. november 2003 - 21:43 #11
De skal ind i array som de er blevet swap'et: 27 35 26 38
Avatar billede arne_v Ekspert
04. november 2003 - 21:45 #12
Hvad så med f'et ?
Avatar billede nejmann Nybegynder
04. november 2003 - 21:46 #13
Ja, hvis det var et ulige nummer, skal det også med som f.eks f3
Avatar billede arne_v Ekspert
04. november 2003 - 21:48 #14
f3 kan ikke puttes i en byte (medmindre vi opfatter det som hex).
Avatar billede nejmann Nybegynder
04. november 2003 - 21:49 #15
Jep, tænkte godt nok på det da jeg skrev det... så skal alle bare opfattes som hex
Avatar billede arne_v Ekspert
04. november 2003 - 21:58 #16
void test(int v)
{
  int i;
  char s[17];
  unsigned char bytes[8];
  sprintf(s,"%d",v);
  if((strlen(s)%2)==1) strcat(s,"f");
  for(i=0;i<strlen(s);i=i+2)
  {
    if(i>0) printf(",");
    printf("%c%c",s[i+1],s[i]);
    bytes[i/2] = ((s[i+1] != 'f' ? s[i+1] - '0' : 0x0f) << 4) | (s[i] - '0');
  }
  printf("\n");
}
Avatar billede arne_v Ekspert
04. november 2003 - 21:58 #17
Men jeg er 98% sikker på at det ikke er det du vil !
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis