2010-07-09 4 views
1

J'ai fait un programme qui convertit les minuscules en majuscules une chaîne.je sais comment convertir un char en majuscules via des directives de préprocesseur, mais je ne sais pas comment le faire pour un chaîne.ne peut pas convertir les minuscules en majuscules par une directive préprocesseur

#include<stdio.h> 
#include<conio.h> 
#include<ctype.h> 
#define UPPER([]) ([]-32) 
void fstring_convert(char string[]); 
void main(void) 
{ 
char string[40]; 
printf("Enter a string:"); 
gets(string); 
fstring_convert(string); 
printf("%s",string); 
getch(); 
} 

void fstring_convert(char string[]) 
{ 
    int i; 
for(i=0; ;i++) 
{ 
    if(string[i]==' ') 
    { 
     string[i]=string[i+1]; 
    } 
    if(isdigit(string[i])) 
    { 
    string[i]+=1; 
    } 
    UPPER('string[i]'); 
    if(string[i]=='\0') 
    break; 
} 

} 
+7

Est-ce que c'est votre devoir? Pour convertir une chaîne en majuscules avec des macros? Vraiment? – Jacob

+1

Impossible d'imaginer que votre tentative bizarre de 'définir 'une macro nommée' UPPER' traverse le préprocesseur. Merci de ne poster que du code qui compile. –

Répondre

5

Les préprocesseurs n'ont pas de boucles. Par conséquent, pour une chaîne de longueur arbitraire, vous ne pouvez pas convertir tous les caractères en majuscules avec une macro de préprocesseur.

Le code que vous avez ci-dessus est bogué parce que votre macro devrait ressembler à:

#define TOUPPER(x) x = (x>='a' && x<='z')?(x-32):x; 

Et puis appelez TOUPPER(string[i]) dans votre boucle for.

Mais je ne vois pas ce que le point de la macro est.

3

Vous devez utiliser la fonction de la bibliothèque standard C toupper() sur chaque caractère de la chaîne (en boucle). Cette fonction a l'avantage de gérer correctement les caractères non alphabétiques.

+0

On m'a dit d'utiliser les directives du préprocesseur –

+0

@fahad: C'est une exigence très inhabituelle. Il y a toujours l'option '#define my_toupper (x) toupper (x)'. –

+0

vous voulez dire que je peux appeler une fonction intégrée dans le préprocesseur? –

3

Ce devoir est de vous renseigner sur la conversion ASCII et la conversion de type. Parcourez la chaîne une lettre à la fois. Pour chaque lettre, recherchez le code ascii de la lettre (recherchez le décalage en majuscule une fois pendant le codage et stockez une constante), puis ajoutez le décalage à la lettre.

Indice: un caractère peut être converti en int.

0

Si vous supposez que vous traitez avec ASCII, alors vous pourriez aussi bien profiter de la façon dont les caractères sont disposés. Pour convertir en majuscule, faites c & ~0x20. Pour convertir en minuscules, faites c | 0x20. Pour basculer entre majuscules et minuscules, c^0x20. Celles-ci consistent essentiellement à ajouter ou soustraire 32 (== 0x20), mais elles sont meilleures dans la mesure où leur application répétée fait ce que vous attendez par exemple. toupper(toupper(c)) est en majuscule, au lieu de c - 64, c'est-à-dire de la poubelle.

Découvrez http://www.kernel.org/doc/man-pages/online/pages/man7/ascii.7.html, en particulier la table hexagonale près de la fin. Il montre clairement la relation entre les différents personnages. Il y a de beaux motifs, mais je suppose que pour des raisons historiques, il y a quelques incongruences malheureuses. Par exemple, pour convertir vous pouvez juste faire « c^0x6 », mais entre ( et ) il est différent, et son différent pour < et > ainsi entre [ et ] ou { et }. Cependant, il est toujours possible de définir une expression sans branche (c'est-à-dire sans if et ainsi de suite) pour calculer le délimiteur correspondant d'un délimiteur quelconque.

Questions connexes