6
votes

Renvoyer un pointeur sur un tableau de charme en C

J'ai vu beaucoup de questions à ce sujet sur Stackoverflow, mais la lecture des réponses ne précisait pas cela pour moi, probablement parce que je suis un débutant total de la programmation C. Voici le code:

#include <stdio.h>

char* squeeze(char s[], char c);

main()
{
  printf("%s", squeeze("hello", 'o'));
}

char* squeeze(char s[], char c)
{
  int i, j;

  for(i = j = 0; s[i] != '\0'; i++)
    if(s[i] != c)
      s[j++] = s[i];
    s[j] = '\0';

  return s;
}


1 commentaires

@Snitko: Où est le type de retour de principal () ?


3 Réponses :


3
votes

Le problème est que le tableau constante charrette "bonjour" n'est peut-être pas correctement modifié par la fonction auquel elle a été transmise. Donc, assurez-vous simplement que vous passez un tableau non constant (par exemple en effectuant une matrice locale à passer, tant que le résultat n'est pas nécessaire en dehors de l'appelant de ): < pré> xxx

On vous attendrait qu'une telle constante ne pouvait être transmise qu'à un argument const (afin que le compilateur lui-même puisse vous dire ce que vous faites mal), mais, hélas, ce n'est pas ce que les mandats standard C (probablement pour des raisons de compatibilité à l'envers avec le code historique).


1 commentaires

Il n'y a rien de temporaire à ce sujet, la chaîne est stockée dans la mémoire "statique".



6
votes

L'argument 1ère transmis à la fonction Squeeze est un lecture seule littéral de chaîne "bonjour" , que vous essayez de modifier.

Le transmettez-le plutôt d'un tableau de caractères modifiable: xxx


1 commentaires

On pourrait également invoquer le principe de moins surprise de suggérer de faire une copie de la chaîne, à la place. Si je passe un char * dans une fonction qui retourne Char *, je ne m'attends peut-être pas à ce que cela modifie la matrice en place. (Les designers de l'API sont souvent négligés pour savoir si elles utilisent const .)



3
votes

Ceci essaie de modifier des données non modifiables.

"Bonjour" est une chaîne constante, stockée en mémoire quelque part. Ce que vous essayez de faire, alors, le change, et cela n'est généralement pas autorisé. Je ne vois pas ce que vous entendez par "statique", mais ce que vous voulez serait quelque chose comme ... xxx


0 commentaires