2010-07-14 5 views
0

je fait un programme qui supprime les espaces et fait une chaîne de majuscules par les directives de préprocesseur .Son ne change pas en majusculesdirective préprocesseur ne fonctionne pas

#include <stdio.h> 
#include <conio.h> 
# define TOUPPER(x) (x-32) 
void main(void) 
{ 
    int i,j; 
    char str[100],*p; 
    clrscr(); 
    printf("Enter the string:\n"); 
    gets(str); 
    for(i=0; ;i++) 
    { 
     if(str[i]=='\0') 
     break; 
     if(str[i]==' ') 
     { 
      for(j=i; ;j++) 
      { 
      str[j]=str[j+1]; 
      if(str[j]=='\0') 
      break; 
      } 
     } 
     if(str[i]<='a'||str[i]>='z') 
     { 
      *p=str[i]; 
      TOUPPER('p'); 

     } 


     } 
     puts(str); 
    getch(); 
} 
+1

Existe-t-il une raison particulière pour laquelle vous n'utilisez pas les fonctions de bibliothèque 'islower' et' toupper'? –

+0

On me dit de faire par des directives de préprocesseur. (Les directives du préprocesseur fonctionnent plus vite que les fonctions) –

+0

Merci beaucoup!Autant que ma connaissance dit quelque chose comme ceci devrait également fonctionner: TOUPPER (& str [i]); mais ça ne marche jamais. –

Répondre

2

Son parce que vous faites

TOUPPER('p'); 

et il est défini comme

(x-32) 

Ceci modifie 'p' en majuscules mais ne l'enregistre pas.

Vous devez changer vous définissez comme celui-ci

#define TOUPPER(x) ((*x)=((*x)-32)) 

juste ne l'appelez comme ceci:

TOUPPER(p); 
8

Votre TOUPPER('p') fait exactement ce qu'il faut, rien. Vous soustrayez 32 de la valeur numérique de 'p', puis vous le jetez. Notez que je me réfère à 'p' le caractère, pas p le pointeur.

+0

Merci beaucoup! Autant que ma connaissance dit quelque chose comme ça devrait aussi fonctionner: TOUPPER (& str [i]); mais ça ne marche jamais. –

3

Peut-être est ce que vous vouliez:

str[i]=TOUPPER(str[i]) 

(Et ne plaisante pas avec les pointeur p)

4

problème est mauvais état de la plage, appel macro avec l'argument constant et vous n'êtes pas assignez la valeur en retour.

if(str[i]<='a'||str[i]>='z') 
     { 
      *p=str[i]; 
      TOUPPER('p'); 

     } 

Correction:

if(str[i]>='a'||str[i]<='z') 
     { 
      str[i] = TOUPPER(str[i]); 
     } 
+0

+1, j'ai négligé le problème de condition de gamme! –

1

Ce n'est pas ce que vous demandez, mais s'il vous plaît noter que vous avez une erreur de pointeur sérieux dans votre programme:

char str[100],*p; 

    ... 

if(str[i]<='a'||str[i]>='z') 
    { 
     *p=str[i]; 
     TOUPPER('p'); 

    } 

Le pointeur est p non initialisé (peut être pointé n'importe où dans la mémoire), et vous assignez le caractère str [i] à l'emplacement mémoire de ce pointeur. p peut être égal à 0x00000000 ou 0xCDCDCDCD ou autre chose, mais dans tous les cas, vous écrivez str [i] à cet emplacement sans initialiser p à une adresse appropriée.

Si vous sentez que vous devez utiliser des pointeurs, vous pouvez le faire de cette façon (ne résout toujours pas le problème de gamme que d'autres ont mentionné, la <= et >= sont en arrière):

if (str[i]<='a'||str[i]>='z') 
{ 
    p=&str[i]; // p now points to the address of str[i] 
    *p = TOUPPER(*p); // p = the address, *p = the contents of that address 
} 
1

Ne croyez pas que l'utilisation de macros préprocesseur est toujours plus rapide que l'utilisation des fonctions de <ctype.h>. Il est hautement probable que ces fonctions soient implémentées en tant que macros de préprocesseur elles-mêmes. Il suffit d'écrire un code facile à comprendre et de ne l'optimiser que si cela est nécessaire.

#include <conio.h> 
#include <ctype.h> 
#include <stdio.h> 
#include <string.h> 

static void 
str_toupper(char *str) 
{ 
    char *p; 

    for (p = str; *p != '\0'; p++) { 
     if (isspace((unsigned char) *p)) { 
      memmove(p + 0, p + 1, strlen(p) - 1); 
     } 
     *p = toupper((unsigned char) *p); 
    } 
} 

int main(void) 
{ 
    char str[100]; 

    clrscr(); 
    printf("Enter the string:\n"); 
    if (fgets(str, sizeof str, stdin) == NULL) 
     return 0; 

    str_toupper(str); 

    printf("%s\n", str); 
    getch(); 
    return 0; 
} 
Questions connexes