Letztes Zeichen einer Zeichenkette entfernen - Probleme

  • C

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Letztes Zeichen einer Zeichenkette entfernen - Probleme

    Hoi,

    ich probiere (verzweifelt) das letzte Zeichen einer Zeichenkette zu entfernen, was mir einfach nicht gelingen will. Ich habe schon was probiert, ist aber nichts schlaues geworden. Hab mich schon in wikimedia die C-Tutorials gelesen :/

    also wenn ich char text[] = "Hallo LeuteX" möchte ich den normalen Text ohne X haben. X ist nur ein beispiel, es kann allerlei sein. Habs auch mit google probiert, aber der hilf mir genauso wenig :/

    kann mir jemand da weiterhelfen?

    mfg & thx

    gfc
    String.SubString(StartIndex, Count)
    Daher wohl
    String.SubString(1, String.Length -1)


    Achso, C. Vergiss es, sorry -.-

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Hi,

    Ein C-String endet immer mit \0 (Terminator). Danach kannst du suchen und dann das Zeichen davor mit \0 ersetzen. Ist aber auch mit 1 Byte Speicherplatzverschwendung verbunden.
    Mit freundlichen Grüßen,
    Thunderbolt
    hab es nun herausgefunden. deine lösung timmy ist mir nicht so klar, hab selber bisschen experimentiert (und hatte bisschen hilfe vom netduino forum :D)

    Quellcode

    1. int index;
    2. index = strlen(text);
    3. // now backspace
    4. index--;
    5. text[index] = 0x00;


    thx

    gfcwfzkm
    @gfcwfzkm:: Bitte mache unbedingt eine Überprüfung. Wenn die Länge des Textes 0 ist kriegst du sonst Probleme!

    Quellcode

    1. int index = strlen(text);
    2. if (--index >= 0)
    3. {
    4. text[index] = '\0';
    5. }
    To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

    At some point in time, you recognize that knowing more does not necessarily make you more happy.
    Danke. Habe nun das problem, das ich eine variable char key = 'X' (wobei X irgend ein ASCII zeichen ist, oder ein 8bit hex-code) nicht sauber in die variable text geladen bekomme.
    Habe im moment folgenden Code-Ausschnitt:

    Quellcode

    1. int main(void)
    2. {
    3. unsigned char* temp = "";
    4. unsigned char TXT[256] = "";
    5. lcdInit();
    6. BIT_CLEAR(cPort, lcdcs2);
    7. unsigned char key, tmp = 0;
    8. uint8_t cmd;
    9. keyboardInit( );
    10. sei();
    11. dPort = 0xB8;
    12. _delay_ms(5);
    13. BIT_SET(cPort, lcde);
    14. _delay_ms(5);
    15. BIT_CLEAR(cPort, lcde);
    16. _delay_ms(5);
    17. setXY(0, 0);
    18. BIT_CLEAR(cPort, lcdcs2);
    19. BIT_SET(cPort, lcdcs1);
    20. BIT_SET(cPort, lcdrs);
    21. dPort = 0;
    22. while(1)
    23. {
    24. if (( key = getKey( )) != 0 )
    25. {
    26. if (key == ESC)
    27. {
    28. clearl();
    29. }
    30. else if (key==F1)
    31. {
    32. printl("TEXT: ");
    33. printl(TXT);
    34. }
    35. else if (key == BS)
    36. {
    37. int index = strlen(TXT);
    38. // now backspace
    39. if (--index >= 0)
    40. {
    41. TXT[index] = '\0';
    42. }
    43. index--;
    44. TXT[index] = 0x00;
    45. clearl();
    46. printl(TXT);
    47. _delay_ms(10);
    48. }
    49. else if (!(key == BS | key == ENTER))
    50. {
    51. lcd_writech(key); //Hier ist mein Problem :(
    52. temp[0] = key;
    53. temp[1] = 0x00;
    54. strcat(TXT, temp);
    55. }
    56. else if (key == ENTER)
    57. {
    58. setXY(0, (page*8)+8);
    59. }
    60. }
    61. key = 0;
    62. _delay_ms(5);
    63. }
    64. }


    Das Problem ist nun, das alle anderen IF-Abfragen 'igonriert' werden. Also ich kann ESC und co nicht mehr betätigen bzw. es überspringt diese einfach. nur allgemeine zeichen kann ich dann eingeben (die if abfrage, wo das problem ist). Ich verstehe nicht, wieso soetwas passiert oder wo ich es schlecht programmiert habe :(
    (Wenn ich die temp[0] und temp[1] zeile auskommentiere, reagieren alle ifanbfragen wieder)

    Ich programmiere nebenbei auf einem AVR ATmega16 Microcontroller, wo ein 128x64 Pixel graphic display ist (monochrom) und als eingabe eine alte PS/2 Tastatur angeschlossen ist. IDE ist AtmelStudio 6.

    den temp[0] = key; code habe ich aus der C-Tutorialreihe von Galileocomputing


    gfcwfzkm

    gfcwfzkm schrieb:

    es überspringt diese einfach
    Setze einen Haltepunkt drauf und überprüf mal, was so in den Variablen drin steht.
    Ist diese endlosschleife gewollt?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ja. Schliesslich ist das ja auf einem Microcontroller. Der soll ständig aktiv sein. Ebenso werden die ganzen if-schleifen erst aufgerufen, wenn in key etwas drin ist, und das ist wieder von der PS/2 Tastatur kontrolliert, die an einem Interup-Port angeschlossen ist.

    Ein Haltepunkt ist gaaanz schlecht zu bewältigen, da ich ja alles auf einem Mikrocontroller ausführe, und habe nur ein ISP-Programmiergerät, kein spezieller Debugger :/

    Habe die F1 taste eingebaut, um den Text anzuzeigen, aber die if-abfrage vom F1 wird ja übersprungen :/

    brauche deswegen hilfe :(

    mfg

    gfc
    nein, da esc funktioniert, wenn ich den problemcode auskommentiere (also das char zu char[] kopieren).
    Esc dient nur dazu, die dargestellte Werte im Display zu löschen.

    bin selber ratlos :(
    Die letzten beiden Zeilen von diesem Code von dir werden vermutlich einen Fehler verursachen, wenn der String eine kleinere Länge als 2 hat:

    Quellcode

    1. int index = strlen(TXT);
    2. // now backspace
    3. if (--index >= 0)
    4. {
    5. TXT[index] = '\0';
    6. }
    7. index--;
    8. TXT[index] = 0x00;


    Du definiert hier temp als einen Char-Pointer:

    Quellcode

    1. unsigned char* temp = "";


    Hier versuchst du anschließend, Daten an die Stelle im Speicher zu schreiben, aber ohne dass dieser vorher reserviert wurde:

    Quellcode

    1. temp[0] = key;
    2. temp[1] = 0x00;


    Das ist wahrscheinlich die Fehlerquelle.

    gfcwfzkm schrieb:

    da ich ja alles auf einem Mikrocontroller ausführe, und habe nur ein ISP-Programmiergerät, kein spezieller Debugger
    Solch unwichtige Information hätte ich im Eröffnungspost auch nicht geschrieben.
    Dann musst Du Dein Programm zeilenweise erweitern und nach jeder neuen Zeile testen.
    Oder
    Schreibe und teste Deine Routinen in einer debug-baren Umgebung (Cross-Compiler).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!