Schleife beendet frühzeitig aufgrund von einem Ende String

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
chris_1981_
Beiträge: 72
Registriert: Sa Jun 15, 2013 8:41 pm

Schleife beendet frühzeitig aufgrund von einem Ende String

Beitrag von chris_1981_ » So Mai 18, 2014 10:57 am

Hallo zusammen,

ich habe für mein aktuelles Problem schon ein paar Bücher durchsucht, um eine Lösung zu finden, aber vielleicht könnt ihr mir noch helfen:
Ich übergebe auf der Kommandozeile folgenden Hexwert:
./ascii 4B76BA1D06
Ich übergebe hier ein Array auf Characters und diese Werte sollen quasi zu dem gewandelt werden, wie es sich oben darstellt.

Aufgrund von vorheriger Hilfen, hier durch dieses Forum, habe ich ein paar Zeilen Code erstellt die es
mir ermöglichen daraus, aus dem Array von Char, ein Array mit den oben genannten einzelnen Werten darzustellen.

Mein Problem ist, dass das Ergebnis des Arrays für die nächste Verwendung nur zu einem Teil verarbeitet wird,
weil beispielsweise auf ein "ENDE" = '\0' String erkannt und reagiert wird.
0-9: 4 newString 04
A-F: B newString 0b
0-9: 7 newString 07
0-9: 6 newString 06
A-F: B newString 0b
A-F: A newString 0a
0-9: 1 newString 01
A-F: D newString 0d
0-9: 0 newString 00
0-9: 6 newString 06
################
INT 4 HEX 04
INT 11 HEX 0b
INT 7 HEX 07
INT 6 HEX 06
INT 11 HEX 0b
INT 10 HEX 0a
INT 1 HEX 01
INT 13 HEX 0d
<--- Hier fehlen noch 00
<--- und 06
################
hier der Code mit den teilen die ich schon aus dem Forum hier erfragt habe.

Code: Alles auswählen

void hexAscii2Int( unsigned char *string, unsigned char *newString )
{
    for(;*string != '\0;' *string++)
    {
        if ( *string >= '0' && *string <= '9')
        {
            *newString = *string - '0';
            printf ("0-9: %c newString %02x \n", *string, *newString);
        }
        else
        {
           if ( *string >= 'A' && *string <= 'F' )
            {
                *newString = (10 + *string) - 'A';
                printf ("A-F: %c newString %02x \n", *string, *newString);
            }
        }
       *newString++;
    }
    *newString = '\0';
}

int main ( int argc, char *argv[])
{
    int i = 0;
    int n = 0;
    unsigned char septs[160] = "";
    unsigned char sms[160] = "";
    unsigned char *text;
    unsigned char *neu;
    text = &septs;
    neu = &sms;
    int bin[160];

    // use the commandline arguments
    // and give back a integer
    hexAscii2Int(argv[1], bin);
    
    //
    printf("################ \n");

    // now check the score from
    // function.
    for(i=0;bin[i]!= '\0';i++)
    {
        printf("INT %i HEX %02x \n", bin[i], bin[i]);
    }

    // script end
    printf("################ \n");
 
    // correct end  
    return 0;
}
Ich habe auch schon versucht in der Funktion: hexascii2int ausschließlich mit Char Variablen zu arbeiten, das macht keinen Unterschied.
Für mich stellen sich 2 Fragen, wie schaffe ich es, dass die Werte / Listen trotz ihres Ende Strings verarbeitet werden und zweitens habe ich mich dieses mal verständlicher ausgedrückt?

Vielen Dank fürs reinschauen!

chris_1981_
Beiträge: 72
Registriert: Sa Jun 15, 2013 8:41 pm

Re: Schleife beendet frühzeitig aufgrund von einem Ende Stri

Beitrag von chris_1981_ » So Mai 18, 2014 11:18 am

Hallo zusammen,

ich habe gerade einfach eine anderes ENDE Stringzeichen eingesetzt und dann geht es.

Was haltet ihr davon, ist das nicht ein wenig "dreckig" programmiert?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Schleife beendet frühzeitig aufgrund von einem Ende Stri

Beitrag von cloidnerux » So Mai 18, 2014 12:59 pm

Mein Problem ist, dass das Ergebnis des Arrays für die nächste Verwendung nur zu einem Teil verarbeitet wird,
weil beispielsweise auf ein "ENDE" = '\0' String erkannt und reagiert wird.
Das Problem ist, das Text und Zahlen zwei verschiedene Dinge sind.
Entweder hast du ein Array aus Characters, also einen Text oder du hast ein Array aus Zahlen.
Man hat dann irgendwann mal die Definition aufgestellt, dass das 0('\0') eben das Ende eines Textes markiert, da die 0 sonst keine Funktion hat. Damit ist es dann auch nicht mehr notwendig die Anzahl der Zeichen in dem String anzugeben, da man ja das Ende erkennen kann.
Wenn du aber mit Zahlen weiter arbeiten Willst, dann musst du die Länge des Strings kennen, da 0 eine gültige Zahl ist.
Redundanz macht wiederholen unnötig.
quod erat expectandum

chris_1981_
Beiträge: 72
Registriert: Sa Jun 15, 2013 8:41 pm

Re: Schleife beendet frühzeitig aufgrund von einem Ende Stri

Beitrag von chris_1981_ » So Mai 18, 2014 4:52 pm

Hallo cloidnerux,

danke für deine Antwort, folgendes war mir klar:
Man hat dann irgendwann mal die Definition aufgestellt, dass das 0('\0') eben das Ende eines Textes markiert, da die 0 sonst keine Funktion hat. Damit ist es dann auch nicht mehr notwendig die Anzahl der Zeichen in dem String anzugeben, da man ja das Ende erkennen kann.
Aber was kann man tun, wenn man aus einem Char Array was Hexwerte beinhaltet: D3B0B94CCF839CCF6B2804 -> diese man aber auch als Hex Werte benötigt machen, wenn bei 00 ein String Ende erkannt wird?

Vielleicht noch deutlicher:
Ich führe aus: ./ascii D3B0B94CCF839CCF6B2804

Ergebnis 1. Schleife mach aus den Characters eine Liste mit den echten Werten aber hintereinander:
A-F: D newString 0d
0-9: 3 newString 03
A-F: B newString 0b
0-9: 0 newString 00
A-F: B newString 0b
0-9: 9 newString 09
0-9: 4 newString 04
A-F: C newString 0c
A-F: C newString 0c
A-F: F newString 0f
0-9: 8 newString 08
0-9: 3 newString 03
0-9: 9 newString 09
A-F: C newString 0c
A-F: C newString 0c
A-F: F newString 0f
0-9: 6 newString 06
A-F: B newString 0b
0-9: 2 newString 02
0-9: 8 newString 08
0-9: 0 newString 00
0-9: 4 newString 04
Schleife dazu:

Code: Alles auswählen

void hexAscii2Int( unsigned char *string, unsigned char *newString )
{
    while(*string)
    {
        if ( *string >= '0' && *string <= '9')
        {
            *newString = *string - '0';
            printf ("0-9: %c newString %02x \n", *string, *newString);
        }
        else
        {
           if ( *string >= 'A' && *string <= 'F' )
            {
                *newString = (10 + *string) - 'A';
                printf ("A-F: %c newString %02x \n", *string, *newString);
            }
        }
       *newString++;
       *string++;
    }
    *newString = '\0';
}
Daraus wird mit der 2. Schleife die mir nur das Ergebnis mitteilen soll, bzw. die nur das Ergebnis nochmals anzeigen soll folgendes:

Int: 211 Hex: d3
Int: 176 Hex: b0
Int: 185 Hex: b9

hier fehlt
hex 04
hex 0c
uvm. +++++
[/quote]

hier die Schleife:

Code: Alles auswählen

int main ( int argc, char *argv[])
{
    char septs[160] = "";
    int i = 0, n = 0;

   hexAscii2Int( argv[1], septs)

    n = strlen(septs);

    for (i=0; i < n ; i++)
    {
        printf("INT %i HEX %02x \n", septs[i],septs[i],septs[i]);
    }

    return 0;
}
Ich habe deinen Tipp mit der Stringlänge, wie du siehst, nachgestellt, doch ohne Erfolg.

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: Schleife beendet frühzeitig aufgrund von einem Ende Stri

Beitrag von oenone » Di Mai 20, 2014 10:04 am

Code: Alles auswählen

for(i=0;bin[i]!= '\0';i++)
Du kennst doch die genaue Länge schon, warum nochmal den Wert als Bedingung nehmen?

Edit: strlen solltest du nicht über das Binär-Array laufen lassen, sondern über den String. Ich würde aber die Konvertierfunktion mitzählen lassen und die Anzahl als Return-Wert übergeben.

Antworten