mikrocontroller.net

Forum: Compiler & IDEs Text in Großbuchstaben umwandeln


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe gerade irgendwie ine Brett vorm Kopf:
also das klappt schon mal tadellos (auch ohne touppr() )
void str_upper(char* s)
{
  while(*s){
    if (*s >= 'a' && *s <= 'z')
      *s = *s - 'a' + 'A';
    s++;
  }
}

nun will ich ja nicht immer den Originattext überschreiben, also:
char* str_upper(char* s)
{
  char* tmp;
  tmp=s;
  while(*s){
    if (*s >= 'a' && *s <= 'z')
      *tmp = *s - 'a' + 'A';
    else *tmp=*s;
    s++;
    tmp++;
  }
  *tmp='\0';
  return (tmp);
}

das klappt aber nicht mehr (ohne Fehlermeldung). Kann mir auf die 
Sprünge helfen?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gast wrote:

> nun will ich ja nicht immer den Originattext überschreiben, also:

Wenn du den Originaltext nicht überschreiben willst, dann muss es ja 
wohl irgendwo eine 2-te Speicherfläche geben, die den geänderten Text 
aufnehmen wird.
Wo ist denn die in deinem Beispiel?

Und nein: Ein Pointer kann auf so eine Speicherfläche zeigen. Er ist es 
aber selber nicht.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Text in Großbuchstaben umwandeln

Wenn du aus Klein- Großbuchstaben machen willst, brauchst du nur das 
fünfte Bit (Wertigkeit 0x20) löschen, mit einer UND-Verknüpfung.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn du aus Klein- Großbuchstaben machen willst, brauchst du nur das
> fünfte Bit (Wertigkeit 0x20) löschen, mit einer UND-Verknüpfung.

Das mag bei 7-Bit-ASCII stimmen, aber bei erweiterten Zeichensätzen mit 
Umlauten geht das je nach verwendeter Codierung richtig schön in die 
Hose.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, das stimmt schon, aber er hatte ja die Abfrage mit drin:
if (*s >= 'a' && *s <= 'z')

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char* str_upper(char* s)
{
  char* tmp;
  tmp=s;        # Fehler: tmp zeigt ins Nirwana
  while(*s){
    if (*s >= 'a' && *s <= 'z')
      *tmp = *s - 'a' + 'A';
    else *tmp=*s;
    s++;
    tmp++;
  }
  *tmp='\0';
  return (tmp);
}

besser:
char* str_upper(char* s)
{
  char* tmp;
  char* tmp1;
  if (!(tmp1 = tmp = malloc(strlen(s)))) {
        exit(1);
  }      
  while(*s){
    if (*s >= 'a' && *s <= 'z')
      *tmp++ = *s++ - 'a' + 'A';
    else *tmp++=*s++;
  }
  *tmp='\0';
  return (tmp1);
}

BTW: was hast du gegen islower und toupper ?????
BTW2: nicht getestet !!!!

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde es nicht mit dynamischer Speicherverwaltung lösen. Einfach 
noch einen weiteren Pointer als Parameter übergeben, wo dann der Text 
hereinkopiert wird.
Als Finesse kann man ja noch eine Abfrage auf NULL-Pointer machen. Wenn 
dann ein NULL Pointer übergeben wird, dann wird der String wieder zurück 
in die Quellvariable hereingeschrieben.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon K. wrote:
> Ich würde es nicht mit dynamischer Speicherverwaltung lösen. Einfach
> noch einen weiteren Pointer als Parameter übergeben, wo dann der Text
> hereinkopiert wird.

Richtig. Das ist mit Sicherheit die bessere Lösung.

Aber nur für den Fall der Fälle, dass sich der OP nicht dazu durchringen 
kann: Es gilt immer noch die Regel: Wiederverwenden!

Die gewünschte Funktion würde ich so schreiben (mit Verwendung des 
orignalen str_upper)
char* str_upper_dup( const char* s)   // Funktionsname in Anlehnung an strdup
{
  char* copy = strdup( s );
  if( copy )
    str_upper( copy );
  return copy;
}

Die Funktion ist schön kurz und es ist leicht sich davon zu überzeugen, 
dass sie genau das macht was sie soll.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dirk wrote:
>
> char* str_upper(char* s)
> {
>   char* tmp;
>   char* tmp1;
>   if (!(tmp1 = tmp = malloc(strlen(s)))) {
> 

Fast
   if (!(tmp1 = tmp = malloc(strlen(s) + 1))) {
>         exit(1);

Das würde ich meinem Benutzer überlassen, was er in so einem Fall zu tun 
gedenkt. Eine Basisfunktion wie str_upper sollte IMHO nicht in der Lage 
sein ein Programm abzuwürgen.
          return NULL;

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon K. wrote:
> Ich würde es nicht mit dynamischer Speicherverwaltung lösen. Einfach
> noch einen weiteren Pointer als Parameter übergeben, wo dann der Text
> hereinkopiert wird.

Dann aber nicht vergessen, auch die Groesse des Zielpuffers mit 
anzugeben.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Stegemann wrote:
> Simon K. wrote:
>> Ich würde es nicht mit dynamischer Speicherverwaltung lösen. Einfach
>> noch einen weiteren Pointer als Parameter übergeben, wo dann der Text
>> hereinkopiert wird.
>
> Dann aber nicht vergessen, auch die Groesse des Zielpuffers mit
> anzugeben.

Ja, die Idee ist brauchbar :-)

Autor: Michael Appelt (micha54)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

*** FLAX-ON
na da hab ich Euch ja erwischt. Mir erzählen, streams seien so aufwändig 
und hier eine einfaches str_Upper() mit malloc() verbasteln.
*** FLAX-OFF

Also die Lösung hier mit malloc() geht genau so lange bis der Speicher 
verbraucht ist, es sei denn, das rufende Programm gibt ihn wieder frei.

Ich habe ein ähnliches Problem, wenn ich Zahlen schnell und kompakt zru 
Ausgabe formatieren will und habe daz ein Modul geschrieben, welches 
einen char buffer(17) enthält. Das reicht für Integer, Hex und uint16 
nach binär inclusive der 0.

Da ich auf dem Display keinen Zeichenmatshc haben will muss ich eh für 
eine kontrollierte Ausgabe sorgen. Bei mir erfolgt doe Verarbeitung im 
Main, also ist das gegeben und alle Funktionen können den Puffer 
gemeinsam nutzen:

char buffer(17);

char * int2bin (unsingne int n) {
  int i = 16;
  while(i) {
    i--;
    buffer(i) = '0' + (n & 1);
    n = n>>1;
  }
  return &buffer;
}


char * int2hex (unsingne int n) {
  int i = 4;
  char d;
  while(i) {
    i--;
    d = n & 0xf;
    if (d<10)
      buffer(i) = '0' + d;
    else
      buffer(i) = 'A' + d - 10;
    n = n>>4;
  }
  return &buffer;
}

Gruß,
Michael

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.