0
votes

Comment basculer le cas des lettres en C?

Mon programme doit basculer les cas de lettres de certaines chaînes données. Par exemple, si les entrées sont les suivantes:

#include <stdio.h>

int my_len(char mystring[])
{
  int i, len = 0;
  for (i = 0; i <= 1001; i++)
  {
    if (mystring[i] != '\0')
    {
      len += 1;
    }
    else
    {
      break;
    }
  }
}

char upper_to_lower(char character)
{
    if (character >= 'A' && character <= 'Z')
    {
        return character - 'A' + 'a';
    }
    return character;
}

char lower_to_upper(char character)
{
    if (character >= 'a' && character <= 'z')
    {
        return character - 'a' + 'A';
    }
    return character;
}

int main()
{
    char list[10][1000];
    int i, count;
    scanf("%d\n", &count);
    for (i = 0; i < count; i++)
    {
        char temp[1000];
        gets(temp);
        strcpy(list[i], temp);
    }
    for (i = 0; i < count; i++)
    {
        //char f_temp[1000];
        int j;
        for (j = 0; j < my_len(list[i]); j++)
        {
            if (j == 0)
            {
                printf("%c", upper_to_lower(list[i][j]));
                //f_temp[j] = lower_to_upper(list[i][j]);
            }
            else if (list[i][j-1] != ' ')
            {
                printf("%c", upper_to_lower(list[i][j]));
                //f_temp[j] = upper_to_lower(list[i][j]);
            }
            else if (list[i][j-1] == ' ')
            {
                printf("%c", upper_to_lower(list[i][j]));
                //f_temp[j] = lower_to_upper(list[i][j]);
            }
        }
        //puts(f_temp);
        printf("\n");
    }
    return 0;
}

c

2 commentaires

Le meilleur moyen de déboguer est d'utiliser un débogueur ou même d'ajouter simplement des déclarations d'impression de débogage. Il y a beaucoup plus de débogage que vous puissiez faire vous-même avant de pouvoir vous demander de l'aide. Comment déboguer de petits programmes . Un gros problème est que my_len ne renvoie rien.


Vous avez d'autres problèmes. Mais c'est le principal. Par exemple, vous n'appelez jamais inférieur_to_upper mais je ne sais pas si cela est intentionnel à ce stade de votre device / test. En outre, votre logique dans principal est beaucoup plus complexe qu'il n'a besoin d'être. Vos deux derniers cas font exactement la même chose dans le corps qui ne semble pas avoir de sens. Je vous conseille de partir et d'utiliser le débogueur maintenant. Débogage détaillé via donc n'est pas productif.


4 Réponses :


2
votes

Le retour est manquant dans my_len . Besoin retour len; comme dernière instruction dans cette fonction.


0 commentaires

1
votes
  1. in my_len Vous ne revenez pas avec len .
  2. dans si (liste [i] [j-1] == '') et j == 0 cas que vous devez utiliser inférieur_to_upper fonction.

0 commentaires

1
votes

Un peu de nettoyage: xxx


0 commentaires

2
votes

C'est une astuce qui fonctionnera avec les caractères ASCII: xxx

L'explication est que le code ASCII pour 'A' est 65 et pour 'A' est 97. Cela signifie que la distance entre lettres majuscules et lettres minuscules est de 32. Ainsi, le 5ème bit va faire le tour.


2 commentaires

Voici une astuce qui fonctionne avec ASCII et EBCDIC : renvoie c ^ ('a' ^ 'A'); . Basculez le ou les bits qui différencient les majuscules et les minuscules. Pas de chiffres magiques. Un peu auto-documentant.


@ chux-réinlevstatemonica merci! Éditera la réponse.