2013-03-19 2 views
1

Je tente désespérément une affectation de programmation. Je ne cherche pas un "c'est comme ça que tu fais ça" mais plus d'un "qu'est-ce que je fais de mal?"phrase capitalizer

Je tente de capitaliser le début de chaque phrase à partir d'une entrée de chaîne. Ainsi, par exemple, la chaîne "Bonjour, je m'appelle John, j'aime faire du vélo". Je voudrais modifier la chaîne et le retourner avec des majuscules par exemple: "Bonjour, je m'appelle John, j'aime faire du vélo." Ma logique semble un peu imparfaite et je suis très perdu.

Ce que je jusqu'à présent ci-dessous. Fondamentalement tout ce que je fais est de tester une ponctuation signifiant la fin d'une phrase. Et puis essayer de remplacer le personnage. Teste également si c'est à la fin de la chaîne de ne pas créer d'exceptions IndexOutOfRange. Bien que, c'est tout ce que j'ai reçu :(

private string SentenceCapitalizer(string input) 
    { 
     for (int i = 0; i < input.Length; i++) 
     { 
      if (input[i] == '.' || input[i] == '!' || input[i] == '?') 
      { 
       if (!(input[i] == input.Length)) 
       {      
        input.Replace(input[i + 2], char.ToUpper(input[i + 2])); 
       }      
      } 
     } 

     return input; 

    } 

Toute aide est grandement appréciée, je suis en train d'apprendre C# et donc les plus élémentaires de l'aide serait de service que je ne sais pas grand-chose:.. P

+0

Que faire si vous avez une abréviation (SOLID) ou points de suspension (. ..) dans votre texte? –

Répondre

1

Vous vérifiez si votre indice actuel est inférieur ou égal à la longueur de la chaîne, puis tenter de modifier un index 2 plus loin le long

if (!(input[i] == input.Length)) 
      {      
       input.Replace(input[i + 2], char.ToUpper(input[i + 2])); 
      } 

devrait être changé pour

if (!((i + 2) >= input.Length)) 
      {      
       input.Replace(input[i + 2], char.ToUpper(input[i + 2])); 
      } 

Ceci va vérifier qu'il ya une valeur 2 places après un signe de ponctuation. Utilisez aussi> = plutôt que == puisque vous sautez de 2, vous pourriez finir par dépasser la longueur du tableau où == renvoie toujours la valeur false, mais il n'y a pas d'index.

+0

Oh d'accord merci. L'exception hors de portée a disparu. Et ça ne marche pas comme prévu, retour à la planche à dessin je suppose. –

3

Au lieu de

if (!(input[i + 2] >= input.Length)) 

Il devrait être

if (!(i + 2 >= input.Length)) 

Vous comparez indices, pas des personnages

1

Les chaînes sont immuables, vous ne pouvez pas faire:

var str = "123"; 
str.Replace('1', '2'); 

Vous avez ai à faire:

var str = "123"; 
str = str.Replace('1', '2'); 
0

Ok, d'autres vous ont fourni quelques conseils pour arrêter les erreurs évidentes, mais je vais essayer de vous donner quelques réflexions sur la façon de mieux mettre en œuvre.

Il vaut la peine de penser à cela comme un processus en 3 étapes

  1. Tokenize la chaîne en phrases
  2. Assurez-vous que le premier caractère de chaque jeton est en majuscule
  3. reconstruisent la chaîne en joignant les jetons retour ensemble

(1) Je vais laisser à votre imagination, mais l'idée est de se retrouver avec un tableau de chaînes avec chaque élément représentant un "s entence » selon vos besoins

(2) est à peu près aussi simple que

// Upercase character 0, and join it to everything from character 1 onwards 
var fixedToken = token[0].ToUpper(CultureInfo.CurrentCulture) 
           + token.Substring(1); 

(3) est également simple

// reconstruct string by joining all tokens with a space 
var reconstructed = String.Join(" ",tokens); 
Questions connexes