Text in Großbuchstaben umwandeln

Gast #1128572
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?
#1128574
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.
Gast #1128718
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 !!!!
Persönliche Seite #1128826
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.
#1129147
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.
#1129154
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;
Gast #1129253
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.
#1137718
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren