Хранение токенов в массиве - PullRequest
1 голос
/ 27 сентября 2019

Мои токены готовы, но я хочу, чтобы они хранились в массиве.

Я попытался создать массив и сохранить токены, но когда я распечатываю массив в моем случае str[0].

, он выводит только символ, а не весь токен.

   int i=0, j=0, t=0;
   char *ptr = argv[1];
   char *str;
   str =(char*) malloc(10 * sizeof(int));

   while (ptr[i] != '\0')
   {
       if (ptr[j] != ';')
       {
           printf("%c", ptr[j]);
           str[t] = ptr[j];
           j++;
       }else
       {
           if (ptr[j] == ';')
           {
               j++;
               str[t] = ptr[j];
               printf("%c\n", ptr[j]);
           }       
       }  
       i++;
       t++;   
    }

    printf("\n%c",str[1]);

Я запустил это на коде

./check "true and false; 1 + 2"

, и вывод, который он мне дает, это

true and false
 1 + 2
r

Мой ожидаемый вывод должен быть 1 + 2, так как я пытаюсь сохранитьвесь токен в одном индексе массива str[0]: true and false

str[1]: 1 + 2

1 Ответ

0 голосов
/ 28 сентября 2019

Я думаю, что эта работа для вас.И я скоро закончу и добавлю больше объяснений.

Уродливая версия.

Код

#include <stdio.h>

int main(int argc, char *argv[]){

    int i,j,t;
    i=j=t=0;
    int nrows=2;
    int ncolumns=50;

    char *ptr = argv[1];//"true and false; 1 + 2";
    char *str;

    char **array1 = malloc(nrows * sizeof(char *)); // Allocate row pointers
    for(i = 0; i < nrows; i++)
      array1[i] = malloc(ncolumns * sizeof(char));  // Allocate each row separately

    i=0;
    while (ptr[i] != ';')
    {
        array1[0][i]=ptr[i];        
        i++;
        //printf("%c ",ptr[i]);
    }

    j=0;
    i++;//not store ;
    while (ptr[i] != '\0')
    {   
        array1[1][j]=ptr[i];
        i++;
        j++;
    }

    printf("%s\n", array1[1]);
}

Редактировать

Лучшая версия

#include <stdio.h>
#include <stdlib.h> //for malloc

int main(int argc, char *argv[]){

    int i,j,t;
    i=j=t=0;
    int nrows=2;
    int ncolumns=50;

    char *ptr = argv[1];//"true and false; 1 + 2";

    char **array1 = malloc(nrows * sizeof(char *)); // Allocate row pointers
    for(i = 0; i < nrows; i++){
      array1[i] = malloc(ncolumns * sizeof(char));  // Allocate each row separately
    }

    i=0;
    int flag=0;

    while(ptr[i]!='\0'){

        if (ptr[i]!=';'){
            array1[flag][j]=ptr[i];     
            j++;
        }else if(ptr[i]==';'){
            flag=1;
            j=0;
        }
        i++;
    }

    printf("%s\n", array1[1]);

    return 0;
}

Статический и динамический,для / пока версия

#include <stdio.h>
#include <stdlib.h> //for malloc



///Can use either
///source: https://stackoverflow.com/a/2614257/7508077

char ** alloc_mem(int nrows, int ncolumns){

    char ** array2 = malloc(nrows * sizeof(char *));      // Allocate the row pointers
    array2[0] = malloc(nrows * ncolumns * sizeof(char)); // Allocate all the elements
    for(int i = 1; i < nrows; i++)
      array2[i] = array2[0] + i * ncolumns;

    return array2;
}

char ** alloc_mem2(int nrows, int ncolumns){

    char ** array2 = malloc(nrows * sizeof(char *)); // Allocate row pointers
    for(int i = 0; i < nrows; i++){
      array2[i] = malloc(ncolumns * sizeof(char));  // Allocate each row separately
    }

    return array2;
}



int main(int argc, char *argv[]){

    int i,j,t;
    i=j=t=0;
    int nrows=2;
    int ncolumns=50;
    char *ptr;


    if (argc==2){
        ptr = argv[1];//"true and false; 1 + 2";
    }else{
        printf("Use true arguments...:  ./check \"true and false; 1 + 2 \"\n    ");
        exit(0);    
    }

    ///Memory   

    //dynamic memory allocation for 2-D char array
    //char **array1;
    //array1=alloc_mem(nrows, ncolumns);

    //or just static allocation with 
    char array1[nrows][ncolumns];

    i=0;
    int flag=0;


///use while or for, i prefer for

/*
    while(ptr[i]!='\0'){

        if (ptr[i]!=';'){
            array1[flag][j]=ptr[i];     
            j++;
        }else if(ptr[i]==';'){
            flag=1;
            j=0;
        }
        i++;
    }
*/

    for(int i=0;ptr[i]!='\0';i++){
        array1[flag][j]=ptr[i];     
        j++;
        if(ptr[i]==';'){
            flag=1;
            j=0;
        }
    }

    printf("%s\n", array1[1]);

    return 0;
}
...