Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Pendant zu strtoint oder itoa ?

7 views
Skip to first unread message

Arne Pagel

unread,
Sep 8, 2001, 6:34:01 PM9/8/01
to
Ich möchte einen integerwert in einen string schreiben,
und zwar in hexdezimal.

Für eine ziffer geht immer noch:

char itoax(int input)
{
if (input > 9)
{
input += 0x41;
}
else
{
input += 0x30;
}
return input;
}

aber sowas gibt es doch sicherlich schon fertig, auch für grössere
zahlen oder ?

--
Gruß
Arne

Tim Lorenz

unread,
Sep 8, 2001, 6:51:16 PM9/8/01
to
In article <3B9A9CD9...@pagelnet.de>, Arne Pagel wrote:
> Ich möchte einen integerwert in einen string schreiben,
> und zwar in hexdezimal.

Dafür gibt es (soweit ich weiß) unter C (ich vermute mal du meinst C)
nur s(n)printf. Ansonsten kannst Du deine ziffernweise Lösung auch
einfach erweitern wie:

static char buffer[100];
static char buffer_past_end=buffer+100;

char* uitoa_str(unsigned int zahl)
{
char* str_pos=str_buf;

*str_pos='0';
++str_pos;
*str_pos='x';
++str_pos;

do {
unsigned int rem = zahl%16;
*str_pos = rem < 10 ? rem+'0' : rem-10+'A';
++str_pos;
zahl/=16;
} while (zahl!=0 && str_pos+1<buffer_past_end);
(*str_pos)='\0';
return str_buf;
}

So in etwa, nicht getestet, aber das Prinzip stimmt wenigstens ;-)

Tim

Arne Pagel

unread,
Sep 9, 2001, 5:23:15 AM9/9/01
to
> nur s(n)printf. Ansonsten kannst Du deine ziffernweise Lösung auch
Das mit sprintf finde ich nicht schön.

> Dafür gibt es (soweit ich weiß) unter C (ich vermute mal du meinst C)

Ja, sonst hätte ich meine frage nicht in c geschrieben :-)


> static char buffer[100];
> static char buffer_past_end=buffer+100;
> char* uitoa_str(unsigned int zahl)
> {
> char* str_pos=str_buf;
> *str_pos='0';
> ++str_pos;
> *str_pos='x';
> ++str_pos;
> do {
> unsigned int rem = zahl%16;
> *str_pos = rem < 10 ? rem+'0' : rem-10+'A';
> ++str_pos;
> zahl/=16;
> } while (zahl!=0 && str_pos+1<buffer_past_end);
> (*str_pos)='\0';
> return str_buf;
> }

Hui, wieder eine menge dazu gelernt, bis ich durch deinen source erstmal
so durchgestiegen bin :-)
Ich denke auch, das das funktionieren sollte, ich probier es mal aus.
warum deklarierst du die buffer statisch ?
--
Gruß
Arne

Tim Lorenz

unread,
Sep 9, 2001, 7:55:28 AM9/9/01
to
In article <3B9B3503...@pagelnet.de>, Arne Pagel wrote:
>> Dafür gibt es (soweit ich weiß) unter C (ich vermute mal du meinst C)
>
> Ja, sonst hätte ich meine frage nicht in c geschrieben :-)

O.K., aber es hätte ja seien können, daß Du C++ noch in Betracht ziehst.

>> static char buffer[100];
>> static char buffer_past_end=buffer+100;
>> char* uitoa_str(unsigned int zahl)
>> {
>> char* str_pos=str_buf;

^^^^^^^
Oups, sollte natürlich 'buffer' heißen.

>> *str_pos='0';
>> ++str_pos;
>> *str_pos='x';
>> ++str_pos;
>> do {
>> unsigned int rem = zahl%16;
>> *str_pos = rem < 10 ? rem+'0' : rem-10+'A';
>> ++str_pos;
>> zahl/=16;
>> } while (zahl!=0 && str_pos+1<buffer_past_end);
>> (*str_pos)='\0';
>> return str_buf;
>> }
>
> Hui, wieder eine menge dazu gelernt, bis ich durch deinen source erstmal
> so durchgestiegen bin :-)

Sorry, war schon spät, sonst hätte ich auch mehr Kommentare geschrieben
(bestimmt ;-).

> Ich denke auch, das das funktionieren sollte, ich probier es mal aus.
> warum deklarierst du die buffer statisch ?

Damit hat der Linker weniger zu tun falls man den Code in
eine dyn. Lib. packt, da dann buffer kein dynamisches Symbol mehr ist,
welches er sonst zu exportieren wäre.

Tim

Arne Pagel

unread,
Sep 9, 2001, 11:24:36 AM9/9/01
to
> O.K., aber es hätte ja seien können, daß Du C++ noch in Betracht ziehst.

Rein c ist mir ersmal lieber.

> Sorry, war schon spät, sonst hätte ich auch mehr Kommentare geschrieben
> (bestimmt ;-).

Nein, war ja nicht schlimm, ich habe das mit dem Fragezeichen vorher
noch nie gesehen, deswegen.


> Damit hat der Linker weniger zu tun falls man den Code in
> eine dyn. Lib. packt, da dann buffer kein dynamisches Symbol mehr ist,
> welches er sonst zu exportieren wäre.

Achso,
Sonst programmiere ich haupsächlich kleine Mikrocontroller, und da zählt
jedes byte was man zusätzlich belegt, deswegen bin ich darüber gestollpert.
Auf dem pc mit soundsoviel ram ist es ja fast egal.


--
Gruß
Arne

Felix von Leitner

unread,
Sep 9, 2001, 7:16:00 PM9/9/01
to
Thus spake Arne Pagel (ar...@pagelnet.de):

> >static char buffer[100];
> >static char buffer_past_end=buffer+100;
> >char* uitoa_str(unsigned int zahl)
> >{
> > char* str_pos=str_buf;
> > *str_pos='0';
> > ++str_pos;
> > *str_pos='x';
> > ++str_pos;
> > do {
> > unsigned int rem = zahl%16;
> > *str_pos = rem < 10 ? rem+'0' : rem-10+'A';
> > ++str_pos;
> > zahl/=16;
> > } while (zahl!=0 && str_pos+1<buffer_past_end);
> > (*str_pos)='\0';
> > return str_buf;
> >}

> Hui, wieder eine menge dazu gelernt, bis ich durch deinen source erstmal
> so durchgestiegen bin :-)

Aus diesem Code kann man in der Tat gut lernen, wie man sowas _nicht_
macht.

Obiges API ist scheiße. Zeiger auf statische Puffer zurückliefern ist
iiih-yuck-kotz, wer sowas macht, programmiert auch in Visual Basic.

Tim Lorenz

unread,
Sep 9, 2001, 7:52:48 PM9/9/01
to
In article <3b9b...@fefe.de>, Felix von Leitner wrote:
> Thus spake Arne Pagel (ar...@pagelnet.de):
>> >static char buffer[100];
>> >static char buffer_past_end=buffer+100;
>> >char* uitoa_str(unsigned int zahl)
>> >{
[snip]

>> > return str_buf;
>> >}
>
>> Hui, wieder eine menge dazu gelernt, bis ich durch deinen source erstmal
>> so durchgestiegen bin :-)
>
> Aus diesem Code kann man in der Tat gut lernen, wie man sowas _nicht_
> macht.
Es sollte dabei auch lediglich um den Algorithmus gehen, eine Lösung
für eine ziffernweise Betrachtung war ja da, jetzt sollte diese auf
Zahlen ausgweitet werden.

> Obiges API ist scheiße. Zeiger auf statische Puffer zurückliefern ist

Volle Zustimmung.
Das int itoax(unsigned int, char*, char*) besser ist, ist wohl klar.

> iiih-yuck-kotz, wer sowas macht, programmiert auch in Visual Basic.

Tim

Frank Klemm

unread,
Sep 10, 2001, 8:24:52 AM9/10/01
to
On Sun, 09 Sep 2001 00:34:01 +0200, Arne Pagel <ar...@pagelnet.de> wrote:
>Ich möchte einen integerwert in einen string schreiben,
>und zwar in hexdezimal.
>
>Für eine ziffer geht immer noch:
>
>char itoax(int input)
> {
> if (input > 9)
> {
> input += 0x41;
> }
> else
> {
> input += 0x30;
> }
> return input;
> }
>
1. Inkompatibel
2. Fehlerhaft
3. Arbeitest Du
auf einem 40x25
Bildschirm?
4. Wo ist das
Abfangen von
Fehlern?

--
Frank

Arne Pagel

unread,
Sep 10, 2001, 11:34:39 AM9/10/01
to
> Es sollte dabei auch lediglich um den Algorithmus gehen, eine Lösung
> für eine ziffernweise Betrachtung war ja da, jetzt sollte diese auf
> Zahlen ausgweitet werden.

Meine vermutung war ja, das es sowas irgentwo fertig in einer lib
versteckt gibt, und das wollte ich eignetlich nur wissen,
aber sorum ist auch gut, da lerne ich wenigstens was bei.

> Das int itoax(unsigned int, char*, char*) besser ist, ist wohl klar.

Gut, ich habe die routine von dir mal so hingeschrieben, wie es mir mal eben so schnell

am besten gefallen hat bzw. was mir am schnellsten eingefallen ist. Ein
/0 habe ich jetzt am Ende noch nicht in den String geschrieben.

char string[6] = {"0x0000"};

void itoax(unsigned int zahl,char *str_pos,char stellen)
{
unsigned int rem;


*str_pos='0';
++str_pos;
*str_pos='x';

str_pos += stellen;

do {


rem = zahl%16;
*str_pos = rem < 10 ? rem+'0' : rem-10+'A';

--str_pos;
--stellen;
zahl /=16;
} while (stellen > 0);
//(*str_pos )='\0';
//return str_buf;
}

Deine hex zahlen waren hinterher "falsch" herum, deswegen habe ich die
Routine so umgebastelt.

Jetzt seit ihr drann, wieder alles auseinander zu nehmen, und mir zu
sagen, was man besser anders macht, was noch fehlt (Fehlerkennung,
besseres handling usw).
--
Gruß
Arne

Arne Pagel

unread,
Sep 10, 2001, 11:43:55 AM9/10/01
to
> 4. Wo ist das
> Abfangen von
> Fehlern?
es ging ja nur ums Prinzip,
aber wenn du schon mekerst könntest du ja wenigstens etwas deutlicher
werden. Was meinst du mit Inkompatibel ?

> 2. Fehlerhaft
ja ok, +0x31


> 3. Arbeitest Du
> auf einem 40x25
> Bildschirm?

nein, auf einem mikrocontroller zumindest
wo ich das so ähnlich gemacht habe.
Aber was ist in der Routine denn Bildschirmabhängig ?

--
Gruß
Arne

Tim Lorenz

unread,
Sep 11, 2001, 9:53:10 AM9/11/01
to
In article <3B9CDFBB...@pagelnet.de>, Arne Pagel wrote:
> es ging ja nur ums Prinzip,
> aber wenn du schon mekerst könntest du ja wenigstens etwas deutlicher
> werden. Was meinst du mit Inkompatibel ?

Er meinte vermutlich, daß Du dich auf den verwendeten Zeichensatz (hier
ASCII) festlegst *), deshalb habe ich auch 'A' geschrieben anstatt 65.
Natürlich hat man noch weiterhin angenommen, daß der Zeichensatz
die Buchstaben direkt hintereinander ablegen (zumindest bei EBCDI ist das
auch der Fall).

Tim

*) zumindest C legt den nämlich nicht fest.

Frank Klemm

unread,
Sep 11, 2001, 11:03:02 AM9/11/01
to
On 11 Sep 2001 13:53:10 GMT, Tim Lorenz <lor...@tnt.uni-hannover.de> wrote:
>
>Natürlich hat man noch weiterhin angenommen, daß der Zeichensatz
>die Buchstaben direkt hintereinander ablegen (zumindest bei EBCDI ist das
^
C
>auch der Fall).
^^^^
nicht

--
Frank Klemm

Anselm Lingnau

unread,
Sep 11, 2001, 11:28:37 AM9/11/01
to
Tim Lorenz <lor...@tnt.uni-hannover.de> schrieb:

> Natürlich hat man noch weiterhin angenommen, daß der Zeichensatz
> die Buchstaben direkt hintereinander ablegen (zumindest bei EBCDI ist das
> auch der Fall).

Verlassen darf man sich darauf laut C-Standard aber nur für die Ziffern
`0' ... `9'.

Anselm
--
Anselm Lingnau .......................................... ans...@strathspey.org
This `telephone' has too many shortcomings to be seriously considered as a
means of communication. The device is inherently of no value to us.
-- Western Union internal memo, 1876

Tim Lorenz

unread,
Sep 11, 2001, 2:09:37 PM9/11/01
to
Nicht komplett, aber für A-F schon: 1. Tetrade 12, 2. Tetrade 1-6

Tim

Frank Klemm

unread,
Sep 12, 2001, 4:03:44 AM9/12/01
to
Die Buchstaben sind bei EBCDIC nicht direkt hintereinander abgelegt.

--
Frank Klemm

Markus

unread,
Oct 20, 2001, 1:40:59 PM10/20/01
to
Arne Pagel wrote:
> Meine vermutung war ja, das es sowas irgentwo fertig in einer lib
> versteckt gibt, und das wollte ich eignetlich nur wissen,

Nimm doch einfach sprintf.

0 new messages