Konvertieren Sie ein int in ein ASCII-Zeichen


75

ich habe

int i = 6;

und ich will

char c = '6'

durch Umwandlung. Irgendeine einfache Möglichkeit vorzuschlagen?

BEARBEITEN: Außerdem muss ich eine Zufallszahl generieren und in ein Zeichen konvertieren, dann eine '.txt' hinzufügen und in einem ifstream darauf zugreifen.

Antworten:


329

Einfacher Weg:

char digits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
char aChar = digits[i];

Sicherer Weg:

char aChar = '0' + i;

Generischer Weg:

itoa(i, ...)

Praktischer Weg:

sprintf(myString, "%d", i)

C ++ Weg: (entnommen aus Dave18 Antwort)

std::ostringstream oss;
oss << 6;

Boss Weg:

Joe, schreib mir einen Int-to-Char-Konverter

Studboss Weg:

char aChar = '6';

Joes Weg:

char aChar = '6'; // int i = 6;

Nasas Weg:

// Warten auf Antwort vom Satelliten ...

Aliens Weg: '9'

//Schöne Grüße.

Gottes Weg:

Bruh ich habe das gebaut

Peter Pans Weg:

char aChar;

switch (i)
{
  case 0:
    aChar = '0';
    break;
  case 1:
    aChar = '1';
    break;
  case 2:
    aChar = '2';
    break;
  case 3:
    aChar = '3';
    break;
  case 4:
    aChar = '4';
    break;
  case 5:
    aChar = '5';
    break;
  case 6:
    aChar = '6';
    break;
  case 7:
    aChar = '7';
    break;
  case 8:
    aChar = '8';
    break;
  case 9:
    aChar = '9';
    break;
  default:
    aChar = '?';
    break;
}

Der Weg des Weihnachtsmanns:

//Wait till Christmas!
sleep(457347347);

Der Weg der Schwerkraft:

//Was

'6' (Jersey) Mikes '™ Weg:

// //

SO übrigens:

Leute, wie vermeide ich es, den Anfängerleitfaden für C ++ zu lesen?

Auf meine Art:

oder die Autobahn.

Kommentar: Ich habe Handy Way und C ++ Way hinzugefügt (um eine vollständige Sammlung zu haben) und speichere dies als Wiki.

Edit: zufrieden?


15
Sie meinten "Chef" wie in "Vorgesetzter", aber ich las es wie in "Chef", wie in "Bruce Springsteen ist der Chef ". Vielleicht könnten Sie für diesen Fall überarbeiten?
g33kz0r

7
Über Joes Weg? Oder Nasas Weg? oder Aliens Weg? Oder Gottes Weg? Oder Peter Pans Weg? Wie wäre es mit dem Weg des Weihnachtsmanns? Oder der Weg der Schwerkraft? Sie sollten eine Liste beginnen? Vielleicht zweimal überprüfen, nur für den Fall, dass Sie etwas verpasst haben?
AbstractDissonance

2
@AbstractDissonance kann das mit Mikes Way ™ bekommen ... Ich mag mich ein paar Jersey Mikes.
cb88

Los geht's! :)
Andrew

OK. Sie wissen immer noch nicht, wie Sie eine Ganzzahl = 31345 einfach in eine ASCII-Zeichenfolge konvertieren können? Übrigens: char * digits = "0123456789"; char aChar = * Ziffern + i;
TomeeNS

26

Dies funktioniert nur für die Int-Ziffern 0-9, aber Ihre Frage scheint darauf hinzudeuten, dass dies möglicherweise ausreicht.

Es funktioniert, indem der ASCII-Wert von char '0'zur Ganzzahl hinzugefügt wird .

int i=6;
char c = '0'+i;  // now c is '6'

Zum Beispiel:

'0'+0 = '0'
'0'+1 = '1'
'0'+2 = '2'
'0'+3 = '3'

Bearbeiten

Es ist unklar, was Sie unter "Arbeit für Alphabete" verstehen. Wenn Sie den 5. Buchstaben des Alphabets wollen:

int i=5;
char c = 'A'-1 + i; // c is now 'E', the 5th letter.

Beachten Sie, dass ich in C / Ascii A als 0. Buchstaben des Alphabets betrachte und ein Minus-1 mache, um die normalerweise verstandene Bedeutung des 5. Buchstabens zu kompensieren.

Passen Sie es an Ihre spezifische Situation an.
(und test-test-test! jeder Code, den Sie schreiben)


Verwirrend bei der Wahl zwischen Klein- und Großbuchstaben.
user963241

4
Nun, Sie müssen uns sagen, was Sie wollen. "Arbeit für Alphabete" ist wirklich nicht sehr beschreibend.
EboMike

13

Nur zu Ihrer Information, wenn Sie mehr als einstellige Zahlen möchten, können Sie sprintf verwenden:

char txt[16];
int myNum = 20;
sprintf(txt, "%d", myNum);

Dann steht die erste Ziffer bei txt [0] in einem Zeichen und so weiter.

(Dies ist der C-Ansatz, nicht der C ++ - Ansatz. Der C ++ - Weg wäre die Verwendung von Stringstreams.)


3
Immer lieber snprintfals sprintf(überlegen Sie sich ein hypothetisches System mit 128-Bit-Ints oder was auch immer). +1 für einen Ansatz, der keine Zeichensätze enthält, bei denen die Zahlen nicht aufeinander folgen.
Mark B

2
@Mark B: Standard C erfordert, dass die Zahlen fortlaufend sind.
Billy ONeal

@Mark Richtig, das ist aus Sicht des Pufferüberlaufs definitiv sicherer.
Nathan S.

4

Mein Weg, diesen Job zu machen, ist:

char to int
char var;
cout<<(int)var-48;
    
int to char
int var;
cout<<(char)(var|48);

Und ich schreibe diese Funktionen für Konvertierungen:

int char2int(char *szBroj){
    int counter=0;
    int results=0;
    while(1){
        if(szBroj[counter]=='\0'){
            break;
        }else{
            results*=10;
            results+=(int)szBroj[counter]-48;
            counter++;
        }
    }
    return results;
}

char * int2char(int iNumber){
    int iNumbersCount=0;
    int iTmpNum=iNumber;
    while(iTmpNum){
        iTmpNum/=10;
        iNumbersCount++;
    }
    char *buffer=new char[iNumbersCount+1];
    for(int i=iNumbersCount-1;i>=0;i--){
        buffer[i]=(char)((iNumber%10)|48);
        iNumber/=10;
    }
    buffer[iNumbersCount]='\0';
    return buffer;
}

3

So habe ich eine Zahl in einen ASCII-Code konvertiert. 0 obwohl 9 im Hex-Code ist 0x30-0x39. 6 wäre 0x36.

unsigned int temp = 6;
or you can use unsigned char temp = 6;
unsigned char num;
 num = 0x30| temp;

Dadurch erhalten Sie den ASCII-Wert für 6. Das Gleiche tun Sie für 0 - 9

Um ASCII in einen numerischen Wert umzuwandeln, habe ich mir diesen Code ausgedacht.

unsigned char num,code;
code = 0x39; // ASCII Code for 9 in Hex
num = 0&0F & code;

2

Ich mag diesen Ansatz besser als die von abelenky vorgeschlagene Zeichenarithmetik, da er nicht von der Arbeit mit dem ASCII-Zeichensatz abhängt (obwohl dies für viele Anwendungen eine ziemlich sichere Annahme ist). Itoa speichert das Ergebnis jedoch in einer Zeichenfolge. Sie müssen daher ein Zeichenarray bereitstellen und das Zeichen daraus extrahieren. Ihre Antwort wäre für Neulinge hilfreicher, wenn Sie sie bearbeiten würden, um diese zusätzlichen Schritte anzuzeigen.
A. Levy

4
-1 sowohl für itoa(nicht standardmäßige MS-Funktion) als auch für die Verknüpfung mit der möglicherweise schlechtesten Site für C- und C ++ - [falsche] Informationen.
R .. GitHub STOP HELPING ICE

"Standard" in C ++ wäre die Verwendung von Streams, alle anderen bisher genannten Methoden haben einige Probleme.
Gene Bushuyev

@R ..: Entschuldigung, könnten Sie dann die beste Seite für c und c ++ verlinken ?
Neuling

4
Nun, dann ist es schlechter als cplusplus.com
Newbie

1

ich vermute das

std::to_string(i)

könnte die Arbeit erledigen, es ist eine überladene Funktion, es könnte ein beliebiger numerischer Typ wie int, double oder float sein


1
zum Beispiel char c = to_string (9) [0];
iceSea

0

"Ich habe int i = 6; und ich möchte char c = '6' durch Konvertierung. Gibt es eine einfache Möglichkeit, dies vorzuschlagen?"

Es gibt nur 10 Zahlen. Schreiben Sie also eine Funktion, die ein int von 0-9 annimmt und den ASCII-Code zurückgibt. Schlagen Sie es einfach in einer ASCII-Tabelle nach und schreiben Sie eine Funktion mit ifs oder einem ausgewählten Fall.


0

Alternativer Weg, aber nicht Standard.

int i = 6;
char c[2];
char *str = NULL;
if (_itoa_s(i, c, 2, 10) == 0)
   str = c;

Oder mit Standard-C ++ - Stringstream

 std::ostringstream oss;
 oss << 6;

itoa ist nicht standardisiert und unsicher (kann zu Pufferüberlauf führen).
EboMike

Okay, Sie haben es jetzt auf die _s-Version bearbeitet. Immer noch nicht Standard, aber ich habe meine Ablehnung entfernt!
EboMike

Richtig! Ich habe den Objektnamen falsch eingegeben, der sein sollte 'oss':)
cpx

0

Während meiner College-Arbeit sammelte ich die gefundenen Daten und gab mir folgendes Ergebnis:

"Die Eingabe besteht aus einer einzelnen Zeile mit mehreren Ganzzahlen, die durch ein Leerzeichen getrennt sind. Das Ende des Eintrags wird durch die Nummer -1 gekennzeichnet, die nicht verarbeitet werden sollte."

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    char numeros[100]; //vetor para armazenar a entrada dos numeros a serem convertidos
    int count = 0, soma = 0;

    cin.getline(numeros, 100);

    system("cls"); // limpa a tela

    for(int i = 0; i < 100; i++)
    {
        if (numeros[i] == '-') // condicao de existencia do for
            i = 100;
        else
        {
            if(numeros[i] == ' ') // condicao que ao encontrar um espaco manda o resultado dos dados lidos e zera a contagem
            {
                if(count == 2) // se contegem for 2 divide por 10 por nao ter casa da centena
                    soma = soma / 10;
                if(count == 1) // se contagem for 1 divide por 100 por nao ter casa da dezena
                    soma = soma / 100;


                cout << (char)soma; // saida das letras do codigo ascii
                count = 0;

            }
            else
            {
                count ++; // contagem aumenta para saber se o numero esta na centena/dezena ou unitaria
                if(count == 1)
                    soma =  ('0' - numeros[i]) * -100; // a ideia é que o resultado de '0' - 'x' = -x (um numero inteiro)
                if(count == 2)
                    soma = soma + ('0' - numeros[i]) * -10; // todos multiplicam por -1 para retornar um valor positivo
                if(count == 3)
                    soma = soma + ('0' - numeros[i]) * -1; /* caso pense em entrada de valores na casa do milhar, deve-se alterar esses 3 if´s
        alem de adicionar mais um para a casa do milhar. */
            }
        }
    }

    return 0;
}

Die Kommentare sind auf Portugiesisch, aber ich denke, Sie sollten verstehen. Bei Fragen senden Sie mir eine Nachricht auf LinkedIn: https://www.linkedin.com/in/marcosfreitasds/


1
Es wäre wirklich großartig, wenn Sie oder natürlich jemand anderes die Kommentare übersetzen könnten!
Csabinho

-2
          A PROGRAM TO CONVERT INT INTO ASCII.




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

           char data[1000]= {' '};           /*thing in the bracket is optional*/
           char data1[1000]={' '};
           int val, a;
           char varray [9];

           void binary (int digit)
          {
              if(digit==0)
               val=48;
              if(digit==1)
               val=49;
              if(digit==2)
               val=50;
              if(digit==3)
               val=51;
              if(digit==4)
               val=52;
              if(digit==5)
               val=53;
              if(digit==6)
               val=54;
              if(digit==7)
               val=55;
              if(digit==8)
               val=56;
              if(digit==9)
                val=57;
                a=0;

           while(val!=0)
           {
              if(val%2==0)
               {
                varray[a]= '0';
               }

               else
               varray[a]='1';
               val=val/2;
               a++;
           }


           while(a!=7)
          {
            varray[a]='0';
            a++;
           }


          varray [8] = NULL;
          strrev (varray);
          strcpy (data1,varray);
          strcat (data1,data);
          strcpy (data,data1);

         }


          void main()
         {
           int num;
           clrscr();
           printf("enter number\n");
           scanf("%d",&num);
           if(num==0)
           binary(0);
           else
           while(num>0)
           {
           binary(num%10);
           num=num/10;
           }
           puts(data);
           getch();

           }

Ich überprüfe meine Codierung und sie funktioniert gut. Lassen Sie mich wissen, ob sie hilfreich ist. Danke.


1
Sie könnten an Ihrer Einrückung arbeiten ... und viel über andere Probleme in diesem Code nachdenken.
Harper
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.