1
votes

Remplacer les lettres majuscules par des minuscules - et vice versa

Chaîne d'entrée: "Ceci est une chaîne" Sortie "tTHIS IS A sTRING

Je suis capable de convertir les majuscules en minuscules mais je ne suis pas en mesure de les lier :(.

voici mon code .. quelqu'un pourrait s'il vous plaît aidez-moi ici?

static void Main()
{
    string lstr = "";
    string ustr = "";
    Console.WriteLine("Enter the string");
    string str = Console.ReadLine();

    char[] strchararr = str.ToCharArray();

    for (int i = 0; i < strchararr.Length; i++)
    {

        if (strchararr[i]>='a'&& strchararr[i]<='z')
        {
            ustr += char.ToUpper(strchararr[i]);

        }

        else if (strchararr[i] >= 'A' && strchararr[i] <= 'Z')
        {
            lstr+=char.ToLower(strchararr[i]);
        }
    }
}


2 commentaires

Que voulez-vous dire mais je ne suis pas en mesure de les lier


vérifiez si Char.IsUpper ou Char.IsLower puis utilisez Char.ToUpper () ou Char.ToLower ()


4 Réponses :


0
votes

Par "les lier", je suppose que vous voulez dire comment obtenir une chaîne résultante entière? Dans ce cas, pas besoin d'utiliser à la fois les variables lstr et ustr, utilisez une seule.

Par exemple: remplacez la ligne

        lstr += char.ToUpper(strchararr[i]);

par

        ustr += char.ToUpper(strchararr[i]);


0 commentaires

4
votes

Utilisez linq

fixed (char* cStr = str)
   for (var c = cStr; c < cStr + str.Length; c++)
     *c = (char)(*c >= 'A' && *c <= 'Z' ? *c + 32 : *c >= 'a' && *c <= 'z' ? *c - 32 : *c);

Ou une approche foreach

for (var i = 0; i < str.Length; i++)
     result += char.IsUpper(str[i]) ? char.ToLower(str[i]) : char.ToUpper(str[i]);

ou

for (int i = 0; i < str.Length; i++)
   if (char.IsUpper(str[i]))
      result += char.ToLower(str[i]);
   else 
      result += char.ToUpper(str[i]);

ou une boucle for

foreach (var c in str)
    result += char.IsUpper(c) ? char.ToLower(c) : char.ToUpper(c);

ou

foreach (var c in str)
   if (char.IsUpper(c))
      result += char.ToLower(c);
   else 
      result += char.ToUpper(c);

Ou une version de pointeur unsafe ridiculement stupide (mais super efficace) (ASCII uniquement)

var converted = str.Select(x => char.IsUpper(x) ? char.ToLower(x) : char.ToUpper(x));
var result = new string(converted.ToArray);


2 commentaires

result + = - ajoutez-vous vraiment des caractères à une chaîne dans une boucle?


@ AntonínLejsek non, regarde autour de lui avec nervosité



1
votes

Votre code a quelques problèmes.

Vous utilisez deux chaînes ustr et lstr . Vous devriez plutôt utiliser une seule chaîne pour stocker le résultat, et ajouter le résultat de char.ToLower et char.ToUpper à cette chaîne.

Vous ne traitent pas non plus autre chose que AZ et az. Vous devez ajouter un bloc else pour simplement ajouter quel que soit le caractère (aucune conversion nécessaire).

    char[] strchararr = str.ToCharArray();

    for (int i = 0; i < strchararr.Length; i++)
    {

        if (strchararr[i]>='a'&& strchararr[i]<='z')
        {
            finalString += char.ToUpper(strchararr[i]);

        }

        else if (strchararr[i] >= 'A' && strchararr[i] <= 'Z')
        {
            finalString+=char.ToLower(strchararr[i]);
        } else {
            finalString += strchararr[i];
        }
    }

    Console.WriteLine(finalString);

Si vous voulez gérer les lettres d'autres alphabets (par exemple cyrillique, grec), vous devez utiliser char.IsLower et char.IsUpper pour vérifier la casse.


2 commentaires

Merci beaucoup pour votre aide et vos explications. C'est tout à fait logique.


@ Ash0214 Veuillez considérer d'accepter la réponse qui vous semble la meilleure en cliquant sur cette coche!



0
votes

Avec des caractères comme nombres:
applicable lorsque tous les caractères ont des CodePoints inférieurs à 256.

StringBuilder sb = new StringBuilder(input.Length);
foreach (char c in input)
    sb.Append(!char.IsLetter(c) ? c : c < 97 ? (char)(c + 32) : (char)(c - 32));


0 commentaires