Forum: Compiler & IDEs Text in Großbuchstaben umwandeln


von gast (Gast)


Lesenswert?

Ich habe gerade irgendwie ine Brett vorm Kopf:
also das klappt schon mal tadellos (auch ohne touppr() )
1
void str_upper(char* s)
2
{
3
  while(*s){
4
    if (*s >= 'a' && *s <= 'z')
5
      *s = *s - 'a' + 'A';
6
    s++;
7
  }
8
}

nun will ich ja nicht immer den Originattext überschreiben, also:
1
char* str_upper(char* s)
2
{
3
  char* tmp;
4
  tmp=s;
5
  while(*s){
6
    if (*s >= 'a' && *s <= 'z')
7
      *tmp = *s - 'a' + 'A';
8
    else *tmp=*s;
9
    s++;
10
    tmp++;
11
  }
12
  *tmp='\0';
13
  return (tmp);
14
}

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

von Karl H. (kbuchegg)


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.

von Matthias L. (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Matthias L. (Gast)


Lesenswert?

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

von Dirk (Gast)


Lesenswert?

1
char* str_upper(char* s)
2
{
3
  char* tmp;
4
  tmp=s;        # Fehler: tmp zeigt ins Nirwana
5
  while(*s){
6
    if (*s >= 'a' && *s <= 'z')
7
      *tmp = *s - 'a' + 'A';
8
    else *tmp=*s;
9
    s++;
10
    tmp++;
11
  }
12
  *tmp='\0';
13
  return (tmp);
14
}

besser:
1
char* str_upper(char* s)
2
{
3
  char* tmp;
4
  char* tmp1;
5
  if (!(tmp1 = tmp = malloc(strlen(s)))) {
6
        exit(1);
7
  }      
8
  while(*s){
9
    if (*s >= 'a' && *s <= 'z')
10
      *tmp++ = *s++ - 'a' + 'A';
11
    else *tmp++=*s++;
12
  }
13
  *tmp='\0';
14
  return (tmp1);
15
}

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

von Simon K. (simon) Benutzerseite


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.

von Karl H. (kbuchegg)


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)
1
char* str_upper_dup( const char* s)   // Funktionsname in Anlehnung an strdup
2
{
3
  char* copy = strdup( s );
4
  if( copy )
5
    str_upper( copy );
6
  return copy;
7
}

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

von Karl H. (kbuchegg)


Lesenswert?

Dirk wrote:
>
1
> char* str_upper(char* s)
2
> {
3
>   char* tmp;
4
>   char* tmp1;
5
>   if (!(tmp1 = tmp = malloc(strlen(s)))) {
6
>

Fast
1
   if (!(tmp1 = tmp = malloc(strlen(s) + 1))) {
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.
1
          return NULL;

von P. S. (Gast)


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.

von Simon K. (simon) Benutzerseite


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 :-)

von Michael A. (micha54)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.