11 Stimmen

eine ganze Zahl in ein Array umwandeln

Ich versuche, eine Integer-Zahl in C in ein Array zu konvertieren, das alle Ziffern dieser Zahl enthält

d.h. wenn ich

int number = 5400

wie kann ich zu

int numberArray[4]

donde

numberArray[0] = 0;
numberArray[1] = 0;
numberArray[2] = 4;
numberArray[3] = 5;

Wir sind für jeden Vorschlag dankbar.

1voto

xtofl Punkte 39285

Wenn Sie negative Zahlen berücksichtigen müssen, benötigen Sie möglicherweise eine zusätzliche Logik. Wenn Sie mit Arrays spielen, deren Größe Sie im Voraus nicht kennen, möchten Sie vielleicht mehr Sicherheitsprüfungen durchführen, und das Hinzufügen einer API für die Handhabung der Datenstruktur ist ebenfalls sehr praktisch.

// returns the number of digits converted
// stores the digits in reverse order (smalles digit first)
// precondition: outputdigits is big enough to store all digits.
//
int convert( int number, int* outputdigits, int* signdigit ) {

  int* workingdigits = outputdigits;

  int sign = 1;
  if( number < 0 ) { *signdigit = -1; number *= -1; }
  ++workingdigits;

  for ( ; number > 0; ++ workingdigits ) {
    *workingdigits = number % 10;
    number = number / 10;
  }

  return workingdigits - outputdigits;
}

void printdigits( int* digits, int size, int signdigit ) {
  if( signdigit < 0 ) printf( "-" );

  for( int* digit = digits+size-1; digit >= digits; --digit ){
    printf( "%d", *digit );
  }
}

int main() {
   int digits[10];
   int signdigit;
   printdigits( digits, convert( 10, digits, &signdigit ), signdigit );
   printdigits( digits, convert( -10, digits, &signdigit ), signdigit );
   printdigits( digits, convert( 1005, digits, &signdigit ), signdigit );

}

0 Stimmen

Zum Glück sind keine negativen Zahlen erforderlich. Es ist ein aufwärts zählender Stundenzähler. Es ist möglich, dass diese Zahl ziemlich groß werden könnte, obwohl.

0voto

C-Code:

/* one decimal digit takes a few more than 3 bits. (2^3=8, 2^4=16) */
int digits[(sizeof (int) * CHAR_BIT) / 3 + 1], 
    *digitsp = digits;
do {
    *digitsp++ = number % 10;
    number /= 10;
} while(number > 0);

Sie sehen, wie viele Stellen Sie umgerechnet haben, indem Sie die Differenz bilden

digitsp - digits

Wenn Sie es in eine Funktion einbauen wollen:

#define MIN_DIGITS_IN_INT ((sizeof (int) * CHAR_BIT) / 3 + 1)

int to_array(int number, int *digits) {
    int *digitsp = digits;
    do {
        *digitsp++ = number % 10;
        number /= 10;
    } while(number > 0);
    return digitsp - digits;
}

int main() {
    int number = rand();
    int digits[MIN_DIGITS_IN_INT];
    int n = to_array(number, digits);

    /* test whether we're right */
    while(n-- > 0) 
        printf("%d", digits[n]);
    }
    printf(" = %d\n", number);
}

Ich ziehe automatische Arrays der dynamischen Speicherzuweisung in diesem Fall vor, da es einfacher ist, es richtig zu machen und nicht versehentlich zu lecken.

0 Stimmen

"Ein bisschen mehr als 3 Bits?" Ich glaube, Sie haben soeben einen Preis für Ihre Ausdrucksweise gewonnen.

0 Stimmen

Ja, ich denke, das klingt seltsam oO ich ändere es

0 Stimmen

Erstaunlich, wie unterschiedliche Logikpfade zu denselben Ergebnissen führen :) 32 / 3 + 1 ist fast dasselbe wie log10(2 ** 32) + 1 == log2(2 ** 32) / log2(10) + 1 == 32 / log2(10) + 1 < 32 / 3 + 1

0voto

droseman Punkte 257

Unter Verwendung des Codes von Vadim habe ich dieses Testprogramm erstellt:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

char * convertNumberIntoArray(unsigned int number) {
    unsigned int length = (int)(log10((float)number)) + 1;
    char * arr = (char *) malloc(length * sizeof(char)), * curr = arr;
    do {
        *curr++ = number % 10;
        number /= 10;
    } while (number != 0);
    return arr;
}

int main(void)
{
    int InputNumber;
    int arr[5];

    printf("enter number: \n");
    scanf("%d", &InputNumber);

    convertNumberIntoArray(InputNumber);

    printf("The number components are: %d %d %d\n", arr[0],arr[1],arr[2]);

    system("PAUSE");    
    return 0;
}

aber die Ausgabe ist miserabel. Kann mir jemand sagen, ob ich hier etwas Dummes gemacht habe?

/***** output *****/
enter number:
501
The number components are: 2009291924 2009145456 -1
Press any key to continue . . .

--Dave

0 Stimmen

Die Funktion gibt ein Array zurück. Sie benötigen dieses: char *arr; arr = convertNumberIntoArray(InputNumber); Beachten Sie, dass arr sollte ein char * , nicht ein int [] . Wenn Sie wollen, dass es ein int * sollten Sie die Funktion so ändern, dass sie Folgendes zurückgibt int * , nicht char * .

0 Stimmen

Vergessen Sie nicht, die Datei anschließend freizugeben (arr). Alternativ können Sie auch den @litb-Ansatz verwenden und ein statisches Array mit der Länge (32/3 + 1) == 11 erstellen und es dann einfach ausfüllen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X