PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sonderzeichenausgabe in xCode, C



darxun
24-03-2008, 20:55
...

case 1:
{
Verschluesseln(szString,iSchl);
printf("Der verschluesselte Text lautet: %s", szString);

...


Im oberen Teil seht ihr unter anderem die printf-Ausgabe. Da der "verschlüsselte" Text meist Sonderzeichen enthält, möchte ich diese auch ausgeben lassen.
Nur ist es in xCode anderes als in VisualStudio so, dass statt den Sonderzeichen Dinge wie /213/220/210 ausgegeben werden.

Wie schaffe ich es, dass trotzdem Sonderzeichen ausgegeben werden und nicht die entsprechenden ASCII-Werte(ich glaube zumindest dass es ASCII-Werte sind.)?



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STRLEN 100

int StringLaenge(unsigned char *szString)
{
int Len=0;
Len=strlen(szString);
return Len;
}
int StringPruefung(unsigned char *szString)
{
int Len=0, ii=0;
Len=StringLaenge(szString);
for(ii=0;ii<Len;ii++)
{
if ((szString[ii]<32)||(szString[ii]>122))
{
return 0; /*Falsche Eingabe*/;
}
}
return 1;
}
void Einlesen(unsigned char *szString)
{
printf("Geben Sie einen Text zum Verschluesseln ein: ");
gets(szString);
}
void Ausgabe(unsigned char *szString, char cWahl);
int Verschluesseln(unsigned char *szString, int iSchl)
{
int ii=0, Len=0;
Len=StringLaenge(szString);
for(ii=0;ii<Len;ii++)
szString[ii] = szString[ii]+iSchl;

return 0;
}
void Entschluesseln(unsigned char *szString, int iSchl)
{
int ii=0, Len=0;
Len=StringLaenge(szString);
for(ii=0;ii<Len;ii++)
szString[ii] = szString[ii]-iSchl;
}
void Verdrehe(unsigned char *szString);

int main (void)
{
unsigned char szString[STRLEN];
int iSchl=0, iy=0, temp=0, Len=0;


Einlesen(szString);
Len=StringLaenge(szString);
printf("Geben Sie einen Schluessel ein: ");
scanf("%d",&iSchl);
temp=StringPruefung(szString);
printf("%d \n\n", temp);
printf("Wollen Sie...\n(1) ...verschluesseln?\n(2) ...entschluesseln?\n");
scanf("%d", &iy);
switch(iy)
{
/*Verschluesselung: Steuerzeichen bis ASCII 31 und ASCII-Werte groesser als 122(z) ausgeschlossen*/
case 1:
{
Verschluesseln(szString,iSchl);
printf("Der verschluesselte Text lautet: %s", szString);
};
break;

/*Entschluesselung: keine Pr¸fung*/
case 2:
{
Entschluesseln(szString,iSchl);
};
break;

default:
{printf("Diese Auswahl gibt es nicht!");
return EXIT_FAILURE;}
break;
}

/*Nur bei Verschl¸sseln String pr¸fen*/
return 0;
}

panzi
27-03-2008, 21:31
Bist du dir ganz sicher dass das nicht dein Terminal ist, der diese Zeichen so anzeigt? Leite die Ausgabe mal in eine Datei um und schau dir die in einen Hexeditor an. z.B.: xxd DATEI|less
Wenn tatsächlich diese Dinge ausgegeben werden, probiers mal den String so auszugeben:

fwrite(szString, strlen(szString), 1, stdout);

darxun
28-03-2008, 11:37
jo, danke ich hab mittlerweile erfahren dass es an der codierung für das terminal liegt. dort hab ich dann mal die codierung umgestellt. nun bekomme ich sinnvolle zeichen. :D

die ascii-erweiterung über 127 ist nicht einheitlich, daher unterscheidet sich das ergebnis nun je nach dem ob ich in visual studio oder xCode compilere. blöd ist halt dass ich in der xCode-konsole die sonderzeichen nicht hinbekomme. ich weiß nicht wo ich das so umstelle, dass es für alles gilt was ich programmiere. sinnvoller wäre es, auch in der xCode-console die sonderzeichen zu haben, dann muss ich nicht jedes mal eine datei öffnen. weißt du wo man das umstellt?

panzi
28-03-2008, 20:56
Ich kenn XCode nicht, kenn aber gcc. Wie auch immer, Kodierungen machen immer (noch) Probleme. Wenn du da keine Probleme haben willst solltest du irgendeine Lib verwenden die mit Encodings umgehn kann. (Oder eine Programmiersprache bei der das builtin der Fall ist.) Bei wirklich proffesionellen Anwendungen schreibt man sowieso keine Strings builtin sondern verwendet ein i18n Framework, welches die Strings der entsprechenden Sprache aus einer Datei lädt. So ein Framework sollte dann auch Encodings richtig handeln bzw. in das gewünschte Encoding umwandeln können. Eine von vielen solchen Libs ist GNU gettext.

panzi
28-03-2008, 20:58
PS: Ich hab die Erfahrung gemacht das die in IDEs eingebetteten Konsolen meistens crap sind und 90% der Sachen die eine Konsole unbedingt können muss nicht können. Sprich ein Testen an der echten Konsole wäre sowieso anzuraten.