C Binärumrechnung

dragonabllz

Ensign
Registriert
Mai 2011
Beiträge
254
Hallo,

ich habe ein Prgoramm entwickelt, dass eine Zahl ins Binär umrechnen soll.
Vorerst aber umgekehrt, das spielt aber momentan keine Rolle.

#include <stdio.h>


main()
{
int str[40];
int i=0, zahl, rest;

scanf("%d", &zahl);
while(zahl != 0)
{
rest = zahl % 2;
zahl = zahl /2;
str= rest;
i++;
}
str = '\0';
printf("%d", str);
}


Wenn ich eine Zahl eingebe z.B: 5, dann kommt als Ausgabe nichts. Egal welche Zahl ich eingebe. Weshalb? Es scheint die letzte Zeile "printf("%d", str)" nict zu stimmen
 
Mit %d kannst du nur numerische variablen ausgeben, keine strings. Bzw. in deinem Fall würde es einfach die erste Ziffer/Zahl ausgeben.

Für Strings ist %s zu verwenden. Aber du hast die Zahlen nicht in ASCII umgewandelt.

str = rest + '0';

Achja, aber str ist ja int, kein char... Also geht auch das nicht.
 
Zuletzt bearbeitet:
Mit %d gibts du ein (!) int-Wert aus. Du hast aber ein int-Array. Also solltest du die Ausgabe in einer Schleife machen. Oder das ganze als char-Array (also quasi String) abspeichern.
 
Ich habe auch schon %s und %c probiert, aber auch diese halfen nicht. Bei %d gibt er mir nichtmal die erste Int Wert aus, also rein garnix, leere Zeile!!??
Ergänzung ()

Wieos muss ich in ASCII umwandeln? Ich habe doch intwerte in den Feld eingetragen, keine ASCII
 
Code:
void main()
{

	string str="FFFFFFFFFFFFUUUUUUUUUUUUUUU!!!!!";

	int i=0, zahl, rest;

	scanf("%d", &zahl);

	while(zahl != 0)
	{
		rest = zahl % 2;
		zahl >>= 1;
		if (rest == 1)
			str[i]= '1';
		else
			str[i]= '0';
		i++;
	}

	str[i] = '\0';

	printf("%s", str.c_str());
}

Schön ist es so aber nicht :D

Edit: Und ich glaube dein Algorithmus gibt den String falschrum raus, man müsste ihn also noch umdrehen.
 
Zuletzt bearbeitet:
Am einfachsteten ist es mit der Ausgabe

Code:
int i = 0;
int laenge = sizeof(str); 

for(i=0; i < laenge; i++) {
printf("%d", str[i] );
}

So gibt man Array korrekt aus...

@F_GXdx: Strings an sich gibt es in C nicht, zumindest nicht ohne ein string.h zu laden und selbst dann ist es nur ein char-Array mit "neuen" Funktionen.

Code:
int main() {
	int str[40];
	int i = 0, zahl, rest;

	scanf("%d", &zahl);
	while (zahl != 0) {
		rest = zahl % 2;
		zahl = zahl / 2;
		str[i] = rest;
		i++;
	}
	str[i] = 2;

	int j = 0;
	for(j=i-1; j>=0; j--) {
		    printf("%d", str[j] );
	}
	return 0;
}

so funtioniert es bei mir.. bei Nachfragen erkläre ich gerne ;)...

edit3: stimmt noch ist es falsch herum
edit4: jetzt aber :D
 
Zuletzt bearbeitet:
Was willst du mit der Zeile:
Code:
str[i] = 2;
Völlig sinnlos :D
 
F_GXdx schrieb:
Was willst du mit der Zeile:
Code:
str[i] = 2;
Völlig sinnlos :D
mittlerweile schon, hab vergessen sie herauszunehmen... ;)
 
Danke an alle, habe das Problem aber anders gelöst ;) :
if (zahl !=0)
{
str = '1';
}
else
str = '0';

Somit hab ich dem Feld "str" ASCII Zeichen übergben, sodass ih die Zeichenkette direkt mit %s ausgeben kann.
Ergänzung ()

Leute, hab noch ne Frage, habe jetzt ne Umkehrmethode für die Binärzahl geschrieben, also eine Methode, die Zeichenketten umdreht.
Nur wenn ich das alles mache, bekomme ich am Ende nur ein Zeichen raus. Ohne diese drittletzte Anweisung "Zeichenkette_drehen(str)" funktioniert alles, nur das das Programm mir natürlich die Binär umgedreht ausgibt.
Hoffe ohr könnt das alles noch verstehen, ist lang geworden:

Code:
#include <stdio.h>


void Zeichenkette_drehen(char bla[])
{
int i=0,c=0;
while(bla[i] != '\0') /* Damit berechne ich die Zeichenlänge im Feld bla*/
{
	i++;
	c++;
}

char um[c];
for(i=0;c>0;c--)        /*hier pack ich alles von bla[] in um[] (um[] dient als zwischenspeicher)*/
{
	um[i]=bla[c-1];
}
um[i+1] = '\0';

for(c=0;i>=0;i--,c++)  /* Hier pack ich wieder als vom Zwischenspeicher in bla[] */
{
	bla[c]=um[c];
}
bla[c] = '\0';

}


int main()
{
	int i=0, zahl, b=DIGITS;  /* DIGITS wurde in einer Header Datei definiert und ist 8 */
	char str[20];

	scanf("%d", &zahl);
	while(b >0)
	{
		if(zahl%2 == 1)
		{
			str[i] = '1';
		}
		else
			str[i] = '0';

		zahl= zahl/2;
		i++;
		b--;
	}
	str[i] = '\0';

	Zeichenkette_drehen(str);

    printf ("Zahl int:%d als Binaerzahl: %s\n",zahl, str);
    return 0;
}
 
Zuletzt bearbeitet:
dragonabllz schrieb:
Nur wenn ich das alles mache, bekomme ich am Ende nur ein Zeichen raus.
Das hörst sich doch stark danach an, als ob eine Variable nicht hochgezählt wird. Vielleicht die in Zeile 16?

Noch als Denkanstoß: Du brauchst du für das Umdrehen eines Arrays keinen "Zwischspeicher". Das geht auch effizienter.
 
Code:
#include <stdio.h>

void Zeichenkette_drehen(char* bla)
{
int i=0,c=0;
while(bla[i] != '\0') /* Damit berechne ich die Zeichenlänge im Feld bla*/
{
	i++;
	c++;
}
 
char* um = 0;
um = new char[c+1];
for(i=0;c>0;c--)        /*hier pack ich alles von bla[] in um[] (um[] dient als zwischenspeicher)*/
{
	um[i]=bla[c-1];
	i++;
}
um[i] = '\0';
 
for(c=0;i>=0;i--,c++)  /* Hier pack ich wieder als vom Zwischenspeicher in bla[] */
{
	bla[c]=um[c];
}
bla[c+1] = '\0';
 
}
 
 
int main()
{
	int i=0, zahl, b=DIGITS;  /* DIGITS wurde in einer Header Datei definiert und ist 8 */
	char str[20];
 
	scanf("%d", &zahl);
	int input_zahl = zahl;
	while(b >0)
	{
		if(zahl%2 == 1)
		{
			str[i] = '1';
		}
		else
			str[i] = '0';
 
		zahl= zahl/2;
		i++;
		b--;
	}
	str[i] = '\0';
 
	Zeichenkette_drehen(&str[0]);
 
    printf ("Zahl int:%d als Binaerzahl: %s\n",input_zahl, str);
    return 0;
}
 
Darlis schrieb:
Das hörst sich doch stark danach an, als ob eine Variable nicht hochgezählt wird. Vielleicht die in Zeile 16?

Noch als Denkanstoß: Du brauchst du für das Umdrehen eines Arrays keinen "Zwischspeicher". Das geht auch effizienter.

Ohman was für ein peinlicher Fehler :heul:
Hat geklappt, vielen vielen Dank :bussi:

Dein Denkanstoss werd ich noch nachgehen, ich mache Optimierungen immer am Ende.

@F_GXdx
Auch danke, obwohl ich nich weiss was deine Änderungen bedeuten (bin noch nicht soweit in C) :)
 
Das Posten von Komplettlösungen (so ganz ohne Kommentar) ist immer wieder schön. Der TE weiß jetzt ganz genau, wo sein Fehler lag und wie er diesen das nächste mal allein lösen kann.
 
Zurück
Oben