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] } ^
3 Réponses :
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: Voici ma solution: p> Temp code> et
jetons code> sont des variables qui se trouvent dans le cadre de pile de la fonction
parsestring () code> fonction. Ainsi, quand il est exécuté fini, ces variables seront parties. La solution idéale est ici pour allouer
jetons code> dans le tas.
Le compilateur a déjà signalé que cette fonction
Many various and unique commands
Une solution plus complète que la mienne +1
L'expression dans l'instruction de retour a le type Char ** code> pendant que le type de retour de la fonction est
char * code> i> réellement
char * [ 3] code>, pas
Char ** code>.
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.
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); }
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?