7
votes

Comment retourner une gamme de cordes en C?

Par exemple, j'ai dans le fichier principal xxx

et dans un fichier importé xxx

Cependant, à la ligne 2 dans la Fichier principal, I Obtenir l'erreur: "Types incompatibles lors de l'affectation à la touche" Numéro de caractère * ** [(in int)] "de type 'char * **'

Qu'est-ce que je suis Je fais mal? Toute suggestions ou conseils seraient appréciés. Je vous remercie d'avance.


6 commentaires

Poster le code actuel? Où est strings défini? Pourquoi prenez-vous un pointeur sur une chaîne littérale? Etc...


Est tableau supposé être cordes ? Essayez-vous de renvoyer un pointeur sur un objet pile alloué?


Je veux juste appeler la fonction Build_Array () et renvoyer la matrice de chaînes (pointeurs sur des tableaux de caractères) à utiliser dans Main.


Les cordes ne sont pas des pointeurs vers des tableaux de caractère, ils ne sont que du pointeur à des caractères.


Droite, mon erreur. Comment ferais-je cela?


Est-ce que je retournerais un pointeur sur un tableau de pointeurs? Comment ferais-je cela?


3 Réponses :


1
votes

Votre type de retour est Char ** , tandis que vous l'attribuez à Char ** [] , c'est incompatible.

Autre que vous devriez poster Le code réel que vous avez du problème, le code que vous avez publié ne compile pas et n'a pas beaucoup de sens.

Pour corriger votre code, la fonction doit être renvoyée char * ** [Numéro] . Remarque En outre, que vous mondez la valeur de retour à char * au lieu de char * ** que vous avez déclaré (ou char * ** [numéro] que cela devrait être, et en fait - est).

OH et renvoyer un pointeur à une variable locale, comme vous le faites dans votre cas, est une recette parfaite pour les accidents et le comportement indéfini.

Ce que vous vouliez dire probablement était: xxx

et dans un fichier importé xxx


1 commentaires

Quel devrait être le type de retour pour renvoyer une gamme de chaînes?



15
votes

Il semble y avoir une certaine confusion quant à ce que la chaîne est en C dans C, une séquence terminée null de Char code> S est considérée comme une chaîne. Il est généralement représenté par char * code>.

Je veux juste appeler la fonction build_array () code> et renvoyer la matrice de chaînes p> blockQuote>

Vous ne pouvez pas retourner un tableau, ni un pointeur à un tableau local. Vous pouvez cependant passer la matrice à build_array code> comme argument, ainsi que sa taille code> et remplir cela à la place. P>

void build_array( char* strings[], size_t size )
{
  // make sure size >= 2 here, based on your actual logic
  strings[0] = "A";
  strings[1] = "B";
}
...later called as:...
char *array[NUMBER];
build_array(array, NUMBER);


6 commentaires

Merci beaucoup. Il compile toutefois, cependant, lorsque j'essaie d'imprimer le contenu, rien n'imprime ni imprime gibberish. Y a-t-il un problème avec l'attribution de valeurs au tableau?


@LearningpyThon: Nous avons vu si peu de votre code, que je ne saurais pas. Comment numéro défini? Comment essayez-vous d'imprimer le contenu?


@LearningpyThon: Eh bien je suis intrigué ... Qu'est-ce que c'était?


Utilisation de int pour une taille de matrice? Ah bon? ;)


@Chris Lutz: Si dans C ++, je serais allé avec std ::ze_t qui n'est pas signé, est-ce votre point?


@ K-ballo - Taille_t est un type en C aussi, c'est le type de valeur renvoyé par taille de . ( taille_t est déclaré dans stddef.h et stdlib.h )



7
votes

Comme Littleadv a souligné, votre code pose plusieurs problèmes:

  • Mismatch entre Char ** code> et Char ** [] CODE> P> LI>

  • retourner un pointeur sur une variable locale p> li>

  • etc. p> li> ul>

    Cet exemple peut aider: P>

    #include <stdio.h>
    #include <string.h>
    #include <malloc.h>
    
    #define NUMBER 2
    #define MAX_STRING 80
    
    char **
    build_array ()
    {
      int i = 0;
      char **array = malloc (sizeof (char *) * NUMBER);
      if (!array)
        return NULL;
      for (i = 0; i < NUMBER; i++) {
        array[i] = malloc (MAX_STRING + 1);
        if (!array[i]) {
          free (array);
          return NULL;
        }
      }
      strncpy (array[0], "ABC", MAX_STRING);
      strncpy (array[1], "123", MAX_STRING);
      return array;
    }
    
    int
    main (int argc, char *argv[])
    {
      char **my_array = build_array ();
      if (!my_array) {
        printf ("ERROR: Unable to allocate my_array!\n");
        return 1;
      }
      else {
        printf ("my_array[0]=%s, my_array[1]=%s.\n",
          my_array[0], my_array[1]);
      }
      return 0;
    }
    


0 commentaires