0
votes

TOKENISANT UNE SORGE ET RETOURNEZ-LE COMME UN TRAIS

Je tente de goûter une chaîne passée, stockez les jetons dans un tableau et le retourner. Je cours sur Ubuntu. Je suis soulevé quand il s'agit de cette langue apparemment.

Entrée d'échantillon: COINFLIP 3 P>

Mon code Pensé Process se lit comme suit: P>

main.c: In function ‘readIn’:
main.c:24:9: warning: function returns address of local variable [-Wreturn-local-addr]
  return param;
         ^~~~~
main.c: In function ‘parseString’:
main.c:32:11: warning: comparison with string literal results in unspecified behavior [-Waddress]
  if (temp == " ")
           ^~
main.c: In function ‘command’:
main.c:59:9: warning: implicit declaration of function ‘fork’ [-Wimplicit-function-declaration]
   pid = fork();
         ^~~~
main.c: In function ‘main’:
main.c:82:10: warning: implicit declaration of function ‘readLine’; did you mean ‘readIn’? [-Wimplicit-function-declaration]
   line = readLine();
          ^~~~~~~~
          readIn
main.c:82:8: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
   line = readLine();
        ^
main.c: In function ‘command’:
main.c:71:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^


8 commentaires

Char * Temp est le bon. strokt retourne un pointeur.Aussi vous devez passer la cmd comme un char *


@ JB1 Qu'est-ce que cette condition cmd == 1 signifie?


@ JB1 Il est également difficile de savoir si la chaîne transmise peut être modifiée.


Nous n'avons donc pas besoin de compiler et de gérer votre code: ce qui ne va pas avec ça?


@Vlad j'ai lu dans un autre poste quelque part que strtok () retourne un int. Je le supprime maintenant que vous le signalez.


Ajouté tout le programme car il est assis actuellement.


@ JB1 La lecture de la fonction a un comportement non défini car il renvoie le pointeur sur un tableau local.


Pouvez-vous donner un exemple d'entrée pendant que vous y êtes?


3 Réponses :


-1
votes

Eh bien, à l'exclusion du fait que ce code n'est pas capable de manipuler plus de 3 jetons, il a un autre problème de base: il retournera un pointeur illégal à la mémoire . Temp et jetons sont des variables qui se trouvent dans le cadre de pile de la fonction parsestring () fonction. Ainsi, quand il est exécuté fini, ces variables seront parties. La solution idéale est ici pour allouer jetons dans le tas.

Voici ma solution: xxx


0 commentaires

2
votes

Le compilateur a déjà signalé que cette fonction

Many
various
and
unique
commands


4 commentaires

Une solution plus complète que la mienne +1


L'expression dans l'instruction de retour a le type Char ** pendant que le type de retour de la fonction est char * réellement char * [ 3] , pas Char ** .


Les fonctions S.S.SANNE peuvent ne pas avoir le type de retour éteint d'un type de tableau. :) L'expression utilisée dans l'instruction de retour est implicitement convertie en pointeur au premier élément de la matrice et a le type de caractères **.


Pardon. Je pensais qu'un pointeur sur un tableau, pas un éventail de pointeurs.



0
votes

Voici un peu de solution récursive à nouveau. Cet idiome utilise la pile d'appels comme espace temporaire afin de n'allocier que la matrice de jetons une fois. Comme il nécessite très peu de comptabilité, le code est radicalement simplifié. Tout le monde ne trouvera pas cela attrayant.

#include <stdlib.h>
#include <string.h>
static char** helper(char* token, int argc) {
  char** retval = token ? parseString(strtok(NULL, " "), argc + 1)
                        : malloc((argc + 1) * sizeof *retval);
  if (retval) retval[argc] = token;
  return retval;
}

char** parseString(char* cmd) {
  return helper(strtok(cmd, " "), 0);
}


0 commentaires