C Programmierung: Byte einlesen und in Bit ausgeben?
Ich möchte ein Byte in binärer Folge einlesen, bearbeiten einzelner Bits und dann das Bitmuster des Bytes wieder ausgeben... Mein Code bisher:
int main( void )
{
int x1,x2,x3,x4,x5,x6,x7,x8;
printf("1 Byte als binaere Folge eingeben: ");
while(8!=(scanf("%d %d %d %d %d %d %d %d",&x1,&x2,&x3,&x4,&x5,&x6,&x7,&x8))||(getchar()!='\n'))
{
printf("Flasche Eingabe: ");
fflush(stdin);
}
.
.
.
printf("\nAktuelles Bitmuster: %d%d%d%d%d%d%d%d\n",x1,x2,x3,x4,x5,x6,x7,x8);
return 0;
}
Wie kann ich das scanf so umschreiben ohne beim eingeben nach jedem Bit ein Leerzeichen eingeben zu müssen? Ich könnte natürlich auch sowas schreiben scanf("%d,%d,%d,%d,%d,%d,%d,%d",&x1,&x2,&x3,&x4,&x5,&x6,&x7,&x8) aber dann muss ich ja zwischen den einzelnen Bits immer ein Komma schreiben... gibt es einen Weg bei dem man das Byte am stück eingeben kann und ich die einzelnen Bits noch bearbeiten kann, ohne das Byte als eine Zahl einzuspeichern (also nicht so scanf("%d", &x)...
Vielen Dank schon mal!
4 Antworten
Du kannst auch bei %d eine Feldbreite angeben:
char end[2];
while ( 9==scanf( "%1d%1d%1d%1d %1d%1d%1d%1d%1[\n]"
, &x1,&x2,&x3,&x4,&x5,&x6,&x7,&x8, &end) )
Und lasse das fflush() weg: Bei Input-Streams ist ihr Verhalten undefiniert. Mit den Standardfunktionen clearerr(stdin) und scanf("%*[^\n]") erreichst Du vermutlich das gleiche.
Du solltest die Schleife aber unbedingt bei feof(stdin) abbrechen, denn wenn keine Eingabe mehr kommt, nützt ein weiterer Versuch auch nichts mehr. Testen kannst Du das auf der Kommandozeile mit
echo 1234567 | myProg.exe
Lies das ganze als String ein entferne die Leerzeichen und dann mach das:
uint8_t byte = 0;
for(int i = 0; i < 8; i++)
if(str[i] == 1)
byte |= 1 << (7 - i);
else if(str[i] != '0')
//Eingabe ist kein Bitmuster
Dann hast du in byte die Zahl stehen die deinem Bitmuster entspricht für die Ausgabe holst du dir die einzelnen Bit wieder über
for(i =0; i < 8; i++)
printf("%d",(byte >> (7-i)) & 1);
for(int i=7;i>=0;--i) printf("%d", byte >> i &1);
Wäre doch sicherlich bequemer ;-).
Nein, das geht nicht. Weil 1010001 als eine Zahl gelesen werden würde. Du könntest mit getchar() eine Funktion bauen, die 8 Zeichen einzeln liest!
Oder
char buffer[9];
scanf("%s", buffer);
Und dann jedes Zeichen einzeln nach 1 und 0 splitten!
Was spricht dagegen, die ganze Zahl einzulesen und dann auseinanderzureißen?
Ansonsten könntest du versuchen, Characters statt Integern einzulesen, in etwa:
scanf("%c....%c", &x1, ..., &x8);
...
printf("%d...%d", x1-48, ..., x8-48);