2011-03-10 2 views
0

Je fonction suivante:Comment imprimer une chaîne contenant des caractères spéciaux et lue à partir d'un fichier? Comment l'imprimer sans caractères spéciaux?

int Printf(const char *s, int length) 
{ 
    int i=0; 
    while(i < length)  
    { 
     printf("%c", s[i]); 
     i++; 
    } 
} 

Mais si je l'appelle avec une chaîne non terminée par NULL comme « Bonjour tout le monde \ n » que je lis à partir d'un fichier, il imprime Bonjour tout le monde \ n sans une nouvelle ligne, de sorte qu'il imprime \ n explicitement. Quel est le problème avec ma fonction?

+0

Voulez-vous dire qu'il imprime vraiment "Hello World \ n", c'est-à-dire un backslash et n? Cela ne peut pas arriver, car \ n est remplacé par char (13) au moment de la compilation. – sashoalm

+0

@satuon: Non, ça arrive, parce que je lis une telle chaîne depuis un fichier – psihodelia

+0

Les chaînes de type Pascal ne sont-elles pas celles dont la longueur est spécifiée dans '[0]'? –

Répondre

1

J'ai réécrite ma fonction si:

int Printf(char *s, int length) 
{ 
    int i=0; 
    char c = '\0', 
     special='\\', 
     newline ='n', 
     creturn ='r', 
     tab  ='t'; 
    while(i < length) 
    { 
     if(c == special) 
     { 
     if(s[i] == newline) 
      printf("\n"); 
     else if(s[i] == creturn) 
      printf("\r"); 
     else if(s[i] == tab) 
      printf("\t"); 
     else if(s[i] == special) 
      printf("\\"); 
     } 
     else if (s[i] != '\\') 
     printf("%c", s[i]); 
     c = s[i]; 
     i++; 
    } 
} 

et maintenant il ne fonctionne pas bien!

+0

ok ... mais les 'mauvaises' combinaisons ne s'impriment pas du tout avec votre code: "foo \ bar" imprime " fooar "(c'est bon, je ne fais que l'élever!). Vous pouvez coder pour ignorer le '\' (imprimer" foobar ") ou tout imprimer (" foo \ bar "). – pmg

2

Il n'y a rien de mal, mais je suppose que le \n est essentiellement dans la chaîne. Lorsque vous écrivez \n à l'intérieur d'une chaîne dans votre programme C/C++ le compilateur le remplacera par le linebreak approprié. Cependant cela ne se produit pas si le \n est dans votre texte (essentiellement "\\n").

Où est la chaîne définie? On dirait que vous devrez peut-être gérer les personnages échappés vous-même.

Btw. selon votre compilateur, vous devriez être en mesure d'utiliser quelque chose comme ça, ce qui est beaucoup plus simple:

printf("%*s", length, s); 

Edit: Il suffit de lire votre commentaire ci-dessus. Vous devrez vous-même gérer le remplacement de la ligne au \n -> si vous lisez la chaîne d'un fichier. printf() ne le traitera pas pour vous.

+0

Veuillez lire ma question originale mise à jour. Je n'ai pas de chaîne de type C, ce n'est pas une chaîne à terminaison nulle. – psihodelia

+0

Je sais, le * dans la chaîne de format indique au compilateur de lire la longueur du paramètre suivant. La chaîne ne doit pas nécessairement être terminée pour que cela fonctionne. – Mario

+0

@Mario: J'ai une fonction printf qui ne le supporte pas (parce que c'est pour un système embarqué spécial) – psihodelia

1

Les caractères spéciaux sont gérés par le compilateur et non par printf. Ils sont convertis au cours de compilation, si

char a[] = "a\n"; 

devient équivalent à

char a[] = { 'a', 13, 0 }; 

printf ne voit jamais "\ n", le compilateur a converti que 13 à l'avance. Et printf n'a pas la capacité de convertir des caractères spéciaux. Lorsque vous lisez "Hello World \ n" à partir d'un fichier, vous ne pouvez pas vous attendre à ce qu'il soit converti par le compilateur.

Questions connexes