funtionsproblem mit pointern und 2d array



  • Hallo ich wollte einen funktion bauen der mir einen string zb "11+22*33/4" aufteilt in ein array im format ("11","+","22","*","33","/","4")

    da es sich um strings handelt ist die ausgabe ja ein 2d char array
    nur irgendwie funktioniert es nicht so wirklich wie ich will kann mir evt einer ein bissl helfen?

    Edit: Achja ich hatte vergessen ich hatte versucht anstelle von char dest[][] und char src[] char **dest und char *src zu nehmen doch das hatte genausowenigs versucht da ich mich in pointern immer verliere

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void parser(char dest[][],char src[])
    { 
      int i,o,u,cnt; 
      o = 0;
      u = 0; 
      cnt = 0;
      for(i=0;i<strlen(src);i++)
      {
        if(src[i]=='/' || src[i]=='*' || src[i]=='-' || src[i]=='+') cnt++;
      }
      char tmp[cnt+cnt+1][256];
      for(i=0;i<strlen(src);i++)
      {
         if(src[i]=='/' || src[i]=='*' || src[i]=='-' || src[i]=='+') 
         {
            u=0;            
            tmp[++o][u++]=src[i];
            tmp[o++][u]='\0';
         }
         if(src[i]=='0' || src[i]=='1' || src[i]=='2' || src[i]=='3' || src[i]=='4' || src[i]=='5' || src[i]=='6' || src[i]=='7' || src[i]=='8' || src[i]=='9')
         {
            tmp[o][u++]=src[i];
            tmp[o][u]='\0';
         }
      }
     return 0;
    }
    
    int main(int argc, char *argv[])
    {
      char tmp[9][256];  
      parser(tmp,"1+2-3/4*5");
      printf("%s\n",tmp);
      system("PAUSE");	
      return 0;
    }
    




  • char tmp[9][256];
    

    Ich halt sonst nix davon, bei proof-of-concept-Programmen über sowas zu
    meckern, aber das klingt nach broken design.

    Üblicherweise teilt man beim Parsen nach tokens.
    Ich würde vorschlagen, daß parser() eine Liste von (abstrakten) Token
    zurückgibt.
    Also würde ich in etwa so anfangen:

    #define INTEGER (1)
    #define OPERATOR (2)
    /* ... */
    
    typedef struct token {
        short type;
        void *data;
    } token_t;
    
    typedef struct token_node {
        struct token_node *prev, *next;
        token_t *token;
    } token_node_t;
    
    token_node_t *parse(char *what);
    


  • ahhh danke hatt mir ein bissl geholfen

    ist zwar nicht die schönste art aber so gehts jetzt ^^

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    char (*par)[256]; 
    
    void parser(char *src)
    { 
      int i,o,u,cnt; 
      o = 0;
      u = 0; 
      cnt = 0;
      for(i=0;i<strlen(src);i++)
      {
        if(src[i]=='/' || src[i]=='*' || src[i]=='-' || src[i]=='+') cnt++;
      }
      char tmp[cnt+cnt+1][256];
      for(i=0;i<strlen(src);i++)
      {
         if(src[i]=='/' || src[i]=='*' || src[i]=='-' || src[i]=='+') 
         {
            u=0;            
            tmp[++o][u++]=src[i];
            tmp[o++][u]='\0';
         }
         if(src[i]=='0' || src[i]=='1' || src[i]=='2' || src[i]=='3' || src[i]=='4' || src[i]=='5' || src[i]=='6' || src[i]=='7' || src[i]=='8' || src[i]=='9')
         {
            tmp[o][u++]=src[i];
            tmp[o][u]='\0';
         }
      }
      par = tmp;
    }
    
    int main(int argc, char *argv[])
    {
    
      parser("11+2-3/4*5");
      printf("%s\n",par[0]);
      system("PAUSE");	
      return 0;
    }
    


  • Ganjaaa schrieb:

    da es sich um strings handelt ist die ausgabe ja ein 2d char array

    muss nicht sein. wenn du's unbedingt in einzelstrings zerstückeln willst, dann nimm doch ein 1d-array, in dem alle 'tokens', durch 0 getrennt, hintereinander liegen und am ende sind 2 nullen.

    Ganjaaa schrieb:

    if(src[i]=='0' || src[i]=='1' || src[i]=='2' || src[i]=='3' || src[i]=='4' || src[i]=='5' || src[i]=='6' || src[i]=='7' || src[i]=='8' || src[i]=='9')
    ...

    ^^dafür nimm besser 'isdigit'
    🙂



  • char tmp[cnt+cnt+1][256];
    

    Sollte sicher nicht static sein?


Log in to reply