C Gross in KleinBuchstaben (dynamisch) c-programming

babadinding

Cadet 2nd Year
Registriert
Apr. 2015
Beiträge
16
Hallo, könnt ihr mal bitte über das Programm schauen ?
Ich weiss nicht, wieso das Programm nicht alle Grossbuchstaben in kleinBuchstaben umwandelt.
Die Aufgabe war:

******************************************************************
"e) Überführen Sie den Text in Kleinschreibung, d.h. ersetzen Sie alle Großbuchstaben
durch Kleinbuchstaben!
Der geänderte Text soll dabei in einer dynamisch definierten neuen Zeichenkette
gespeichert werden!
Lösen Sie diese Aufgabe auch mit Hilfe einer Funktion, die den ASCII-Code eines als
Parameter übergebenen Zeichens nötigenfalls verändert zurückliefert! "
******************************************************************


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void turn_downstring(char string[], int length){

char *word;
int i, numberofbytes;

length=strlen(string);

numberofbytes=sizeof(string);

word=(char*)malloc(numberofbytes);


for(i=0; i<length; i++){
if(string>=65 && string<=90){

word=string<=97 && string<=122;
}
else
{
word=string>=65 && string<=90;

}


}
printf("%s\n", word);

}


int main(){

int size, numberofbytes;
char text[]="hello WoRLD";
size=strlen(text);
numberofbytes=sizeof(text);

printf("%s\n %d\n %d\n", text,size,numberofbytes);

turn_downstring(&text[0], size);

return 0;}

Das ist der Ausgabe:

hello WoRLD
11
12
 
Zuletzt bearbeitet:
babadinding schrieb:
Hallo, könnt ihr mal bitte über das Programm schauen ?
Ich weiss nicht, wieso das Programm nicht alle Grossbuchstaben in kleinBuchstaben umwandelt.

Kannst Du mal bitte Quelltext in

[CODE]

[/CODE]


setzen? Danke!

/EDIT:
Code:
    if (string[i] >= 65 && string[i] <= 90) {
       word[i] = string[i] <= 97 && string[i] <= 122;
    }
    else {
       word[i] = string[i] >= 65 && string[i] <= 90;
    }

Siehst Du was?
word = string >= 65 && string <= 90; macht nicht was Du denkst.
 
Zuletzt bearbeitet:
Du kannst auch <= 'A' benutzen statt die Integer Werte der Tabelle zu nehmen ;)

Statt über length zu iterieren kannst auch while != '\0' nehmen, also bis zum terminal Symbol.
So wird ohnehin die Länge ermittelt, falls sie nicht anderweitig mitgegeben wird (z.B. ein struct mit string und länge).
 
Zuletzt bearbeitet:
Ich sehe es einfach nicht. Brauche eine Denkhilfe. Komm nicht voran.
Ergänzung ()

Das mit while und Zeichen 'A' ist zwar net , aber ändert auch nichts an der Lösung.
 
babadinding schrieb:
Ich sehe es einfach nicht. Brauche eine Denkhilfe. Komm nicht voran.

Dann erklär mir bitte mal jede Zeile aus dieser Variante:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

 char *turn_downstring(char *text, int s_length)
{
 char *words = malloc((s_length+1)*sizeof(char));
 strcpy(words, text);

 for (int i=0; i<s_length; i++)
    if (words[i]>='A' && words[i]<='Z')
       words[i] = string[i] + ' ';

 words[s_length] = '\0';
 return words;
}

 int main()
{
 char text[] = "hello WoRLD";
 int s_length = strlen(text);
 printf("%s\n (%d)\n", text, s_length);
 printf("%s\n", turn_downstring(text, s_length));

 return 0;
}
Zu jeder Zeile bitte so genau wie möglich schreiben was die macht ...
 
Zuletzt bearbeitet:
for(i=0; i<length; i++){
if(string>='A' && string<='Z'){

word=string+32;
}
else
{
word=string;

}

ok hab die loesung^^

danke noch einmal .
Ergänzung ()

Siehst Du was?
word = string >= 65 && string <= 90; macht nicht was Du denkst.

Der Fehler lag hier. Hier findet ja keine Bedingung statt^^
Hab es übersehen.
 
Generell sollte man Zuweisungen und Bedingungen sauber trennen und Klammern nutzen wo es nur geht.
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *turn_downstring(char *text, int s_length) // Hierwird eine Funktion erstellt mit Rückgabewert char und Parameter *text und length
{
char *words = malloc((s_length+1)*sizeof(char)); // Hier wird länge von string in den pointer words gespeichert.
strcpy(words, text); // hier wird eingegebene text in word kopiert.

for (int i=0; i<s_length; i++) // for schleife für jedes einzelne element vom wort bis ende des wortes
if (words>='A' && words<='Z') // abfrage von gross A bis Gross Z
words = string + ' '; // falls ja soll er 32 zeichen hochzaehlen und dort dann das ascii zeichen ausgeben, da ' ' zahl 32 ergibt

words[s_length] = '\0'; // terminator wird gesetzt
return words; // gibt das neue umgeänderte wort zurück
}

int main()
{
char text[] = "hello WoRLD";
int s_length = strlen(text);
printf("%s\n (%d)\n", text, s_length);
printf("%s\n", turn_downstring(text, s_length));

return 0;
}

Zu jeder Zeile bitte so genau wie möglich schreiben
 
black90 schrieb:
Generell sollte man Zuweisungen und Bedingungen sauber trennen und Klammern nutzen wo es nur geht.
Der Compiler sollte eigentlich eine Warnung werfen:
Code:
asdf@chelloveck:~/src$ less assignment-as-bool.c
int main(void) {
        int i;

        if(i = 2)
                return 1;

        return 0;
}
asdf@chelloveck:~/src$ clang assignment-as-bool.c
assignment-as-bool.c:4:7: warning: using the result of an assignment as a
      condition without parentheses [-Wparentheses]
        if(i = 2)
           ~~^~~
assignment-as-bool.c:4:7: note: place parentheses around the assignment to
      silence this warning
        if(i = 2)
             ^
           (    )
assignment-as-bool.c:4:7: note: use '==' to turn this assignment into an
      equality comparison
        if(i = 2)
             ^
             ==
1 warning generated.
 
Zuletzt bearbeitet:
Zurück
Oben