Frage zum Umgang mit Pointern
-
Hallo,
hätte kurz 'ne Frage, bezüglich auf unser kleines Programm, welches wir für dir Uni erstellen müssen. Folgendes: Das Programm erwartet irgendein Zeichen (ASCII --> (0,255)). Falls der eingegebener ein kleiner Buchstabe ist muss dieser in einen großen umgewandelt und ausgegeben werden, ansonst muss das selbe Zeichen wieder ausgegeben werden. Ich hab 'ne changeCharacter Funktion gebastelt welche für die umwandlung der Zeichen sorgt, jedoch weiss ich nicht worin genau der Fehler hier liegt.. Da ich mich mit Pointer und deren dereferenzierung nicht gut auskenne bitte ich um eure Erleuchtung.
void changeCharacter(char* char_b)
{
char char_ascii;
char_b = &char_ascii;
int bitmask_one = 0xDF;//Table of small characters in ASCII (97, 122)
if(char_ascii>=0x61 && char_ascii<=0x7A)
{
char_ascii &= bitmask_one;
}
else
{
char_ascii = char_ascii;
}
}int main()
{
char entry_character;printf("Please enter a character: ");
scanf("%c", &entry_character);
changeCharacter(&entry_character);
printf("%c", entry_character);
return 0;
}
-
Wenn du in C einen Parameter einer Funktion übergibst, geschieht das immer by-value, d.h. der Parameter wird aufn Stack gepusht und im Stack-Frame der Funktion wird auf der Kopie gearbeitet.
Wenn du z.B. in deiner Funktion den Zeiger umbiegst (char_b = &char_ascii;), dann kriegt der Aufrufer davon nichts mit.Lösen könntest du das z.B. so (ungetestet):
void convert(char* c) { if(*c >= 'a' && *c <= 'z') *c-=32; }
'a' wäre auf jeden Fall lesbarer als "magic numbers" wie 0x61.
-
Noch lesbarer wäre eine Funktion wie toupper.
-
So würde es gehen,
void changeCharacter(char* char_b) { int bitmask_one = 0xDF; /*Table of small characters in ASCII (97, 122)*/ if(*char_b>=0x61 && *char_b<=0x7A) { *char_b &= bitmask_one; } }
char_b ist eine Adresse und du änderst bei Bedarf den Speicherbereich (1 char) auf den char_b verweist.
-
Hallo nochmal,
jetzt check ich die ganze sache, vielen dank leute.
mfg