2009-09-30 9 views
3

J'ai seulement accès à 'C' et j'ai besoin de remplacer les caractères dans un tableau de caractères. Je n'ai pas trouvé de solutions propres pour cette procédure relativement simple.Supprimer les caractères d'une chaîne dans C

Je suis passé un tableau de caractères, par exemple:

char strBuffer[] = "/html/scorm12/course/course_index.jsp?user_id=100000232&course_id=100000879&course_prefix=ACQ&version=2&scorm_version=3&roster_id=100011365&course_name=Test%20Course%201.2&mode=browse&course_number=0000&mode_id=1"; 

J'ai besoin de modifier ce tampon pour remplacer toutes les & avec &. Le tampon résultant n'a pas à remplacer strBuffer (un nouveau tampon peut être créé).

Des suggestions?

Edit:

Dans le passé, je l'ai fait la fonction strstr dans une boucle, mais était à la recherche d'une solution plus simple, peut-être l'équivalent C à la méthode String.Replace.

Edit:

Pour mes besoins immédiats, ce qui suit est tout ce que je dois.

char strBuffer[] = "/html/scorm12/course/course_index.jsp?user_id=100000232&course_id=100000879&course_prefix=ACQ&version=2&scorm_version=3&roster_id=100011365&course_name=Test%20Course%201.2&mode=browse&course_number=0000&mode_id=1"; 
char strTemp[1024]; 
char *s = (char*)strBuffer; 
int i=0; 

while (*s) 
{ 
    strTemp[i++] = *s; 
    if (strncmp(s,"&",5) == 0) 
    { 
     s += 5; 
    } 
    else 
     s++; 
} 
strTemp[i] = 0; 

modifications futures:

  • créer une fonction utilitaire pour stocker cette fonction.
  • Transmettez la chaîne de recherche en tant que paramètre.
  • Déterminer la longueur de la chaîne de recherche, de sorte que les 5 codés en dur peuvent être supprimés.
  • Allouer dynamiquement la variable strTemp.
  • Erreur lors de la vérification des chaînes vides et des caractères non trouvés.

EDIT:

I créé un blog en détail les étapes et fournir une solution plus souple:

http://www.solutionmaniacs.com/blog/2012/11/25/c-removereplace-characters-in-a-string.html

+0

Est-ce que ce sont les devoirs? (Tout va bien si c'est le cas, il suffit de le marquer comme '[devoirs]' si approprié.) –

+1

Toute méthode 'String.Replace' dans un langage de niveau supérieur va vraiment se résumer à' strstr() 'dans une boucle à le niveau C C ne concerne pas des idéaux si élevés comme «l'abstraction» et «la facilité d'utilisation». –

+0

Merci à tous ceux qui m'ont aidé avec cette solution. Je suis un peu gâté en C# et je oublie comment faire une manipulation de chaîne relativement simple dans C. –

Répondre

1
char *s = (char*)strBuffer; 
char sClean[strlen(strBuffer) + 1]; /* +1 for null-byte */ 
/* if above does not work in your compiler, use: 
    char *sClean = (char*)malloc(sizeof(strBuffer) + 1); 
*/ 
int i=0; 
while (*s) 
{ 
    sClean[i++]= *s; 
    if ((*s == '&') && (!strncmp(s, "&", 5)) s += 5; 
    else s++; 
} 
sClean[i] = 0; 
+0

Les tableaux de longueur variable (comme' sClean char [strlen (strBuffer)]; 'ci-dessus) sont C99 seulement, et ne sont pas entièrement supporté par un grand nombre de compilateurs –

+0

Noté Si le compilateur de Q peut le faire, Q peut utiliser malloc – slashmais

+0

Entités HTML: http://www.w3.org/TR/html4/sgml/entities.html#h -24.2.1 – pmg

2

allouer un autre tampon, soit sur la pile ou le tas , puis copiez la chaîne dans le nouveau tampon 1 caractère à la fois. Faites une manipulation spéciale lorsque vous rencontrez le caractère &.

+1

C'est un littéral de tableau, et il peut être changé car il est stocké dans un tableau. Un 'char * c =" chaîne ";' ne peut pas être. Mais oui, vous ne devriez pas le changer pour éviter de faire ce genre d'erreur à l'avenir. –

+0

En fait, dans l'exemple publié (sauf s'il a été modifié après votre réponse), strBuffer est un tampon qui est inscriptible et initialisé en copiant la chaîne littérale dans le tampon. –

+0

désolé vous avez raison c'est un tableau littéral: sizeof (strBuffer) == 249 –

5

C n'est pas connu pour sa facilité d'utilisation, en particulier lorsqu'il s'agit de chaînes, mais il a quelques fonctions de bibliothèque standard plutôt sympa qui feront le travail. Si vous avez besoin de travailler de façon intensive sur les chaînes que vous aurez probablement besoin de savoir sur les pointeurs et l'arithmétique des pointeurs, mais sinon voici quelques fonctions de bibliothèque qui sera sans aucun doute vous aider:

  • strchr() pour trouver un caractère (par exemple, '&') dans une chaîne.
  • strcmp() et strncmp() pour comparer deux chaînes.
  • strstr() pour trouver une sous-chaîne dans une chaîne (probablement plus facile et plus rapide que d'utiliser la combinaison strchr()/strcmp()).
  • malloc() pour allouer une nouvelle chaîne.
+0

Une raison pour la downvote ici? –

+0

Merci ... il y a beaucoup de fonctions C standard qui peuvent être très pratiques! –

+0

N'oubliez pas d'utiliser les fonctions mem *! –

4

Fondamentalement, vous devez:

  • utiliser la fonction strstr() pour trouver le "& amp;" s
  • caractères de copie au résultat tampon jusqu'à la position trouvée
  • sauter 4 caractères
  • répéter jusqu'à NUL
+0

Vous pouvez utiliser 'strstr()' mais vous pouvez également utiliser 'strchr()' pour trouver les '&' s, puis voir si les caractères suivants sont "&": 'char * amp = strchr (string, '&'); if (amp &&! strncmp (amp, "&") {/ * nous l'avons trouvé! * /} 'Bien que ce ne soit probablement qu'une version moins optimisée de' strstr() '(que je suis fâché j'ai oublié) –

+1

strstr() est plus générique et pratique, il peut aussi être plus rapide, en fonction de la façon dont strstr() est implémenté Je recommande son approche Si la vitesse est vraiment un souci, un algorithme plus sophistiqué comme KMP est préféré, mais je suppose que – user172818

+0

@Chris Dans ce cas, vous ne faites essentiellement que manuellement le travail de strstr() à l'intérieur de votre bloc conditionnel.Je pense qu'il serait plus sage d'utiliser la fonction standard pour atténuer les erreurs potentielles –

Questions connexes