Как передать массив строк в функцию в C? - PullRequest
0 голосов
/ 12 октября 2018

Итак, у меня есть эта функция (makeStruct), которая может взять ОДНУ строку и распечатать элементы структуры.Например, моя строка, которую я передаю, - "a = 2.b, 1.d, 3.d; 4.o; milk cheese", и она проходит через мою функцию, которая сохраняет каждое число, букву и слово в соответствующем элементе структуры, который я создал.Это прекрасно работает, но только с одной строкой:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct stopPoints {
    int  weights[10];
    char connectingPoints[10];
    char *items[30];
    int startBool;
};


void makeStruct(char str[]){

    struct stopPoints myPoint;
    char *arr[30];
    char * pch;
    pch = strtok (str," ;=,.-");
    arr[0] = pch;
    int i=0;


  for (pch; pch != NULL; i++){
    pch = strtok (NULL, " ;=,.-");
    arr[i+1] = pch;
    //printf("%s\n", arr[i]);

  }
  printf("\n");
  char letters[10];
  int numbers[10];
  char *strings[10] = {NULL};
  int p, iter=0, iter2=0, iter3=0, val[10];
  for (p=0; arr[p] != NULL; p++){
      //if its a string
      if (isalpha(*arr[p]) && strlen(arr[p]) >=2 ){
        //printf("%s is a string\n", arr[p]);
        myPoint.items[iter] = arr[p];
        iter++;
      }
      //if its just a letter
      else if (isalpha(*arr[p]) && strlen(arr[p]) ==1){
        //printf("%s is a letter\n", arr[p]);
        letters[iter2] = *arr[p];
        myPoint.connectingPoints[iter2] = letters[iter2];
        iter2++;
        //printf("letter\n");
      }
      //if its a number
      else if (isdigit(*arr[p])){
        //printf("%s is a number\n", arr[p]);
        val[iter3] = atoi(arr[p]);
        myPoint.weights[iter3] = val [iter3];
        iter3++;
      }
  }



  printf("%s %s\n",  myPoint.items[0], myPoint.items[1]);

}


int main ()
{
        char str[] = "a = 2.b, 1.d, 3.d; 4.o; milk cheese";
        makeStruct(str);
  return 0;
}

Теперь я хочу иметь возможность передавать несколько строк в эту функцию.Вот где моя проблема.Я пробовал несколько разных подходов, но я не понимаю, где я иду не так.Пожалуйста, взгляните на код ниже:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct stopPoints {
    int  weights[10];
    char connectingPoints[10];
    char *items[30];
    int startBool;
};


void makeStruct(char str[]){

    struct stopPoints myPoint;
    char *arr[30];
    char * pch;
    pch = strtok (str," ;=,.-");
    arr[0] = pch;
    int i=0;


  for (pch; pch != NULL; i++){
    pch = strtok (NULL, " ;=,.-");
    arr[i+1] = pch;
    //printf("%s\n", arr[i]);

  }
  printf("\n");
  char letters[10];
  int numbers[10];
  char *strings[10] = {NULL};
  int p, iter=0, iter2=0, iter3=0, val[10];
  for (p=0; arr[p] != NULL; p++){
      //if its a string
      if (isalpha(*arr[p]) && strlen(arr[p]) >=2 ){
        //printf("%s is a string\n", arr[p]);
        myPoint.items[iter] = arr[p];
        iter++;
      }
      //if its just a letter
      else if (isalpha(*arr[p]) && strlen(arr[p]) ==1){
        //printf("%s is a letter\n", arr[p]);
        letters[iter2] = *arr[p];
        myPoint.connectingPoints[iter2] = letters[iter2];
        iter2++;
        //printf("letter\n");
      }
      //if its a number
      else if (isdigit(*arr[p])){
        //printf("%s is a number\n", arr[p]);
        val[iter3] = atoi(arr[p]);
        myPoint.weights[iter3] = val [iter3];
        iter3++;
      }
  }



  printf("%s %s\n",  myPoint.items[0], myPoint.items[1]);

}


int main ()
{



    char *str[9];
    str[0] = "a = 2.b, 1.d, 3.d; 4.o; milk cheese";
    str[1] = "b = 2.a, 1.e, 2.c; water juice drinks";
    str[2] = "c = 2.b, 1.f; chips snacks";
    str[3] = "d = 1.a, 1.g; bread cereal pasta";
    str[4] = "e = 1.h, 1.b; meat chicken fish";
    str[5] = "f = 1.i, 1.c; oils sauces condiments";
    str[6] = "g = 1.j, 1.d; soup canned_goods";
    str[7] = "h = 1.k, 1.e; produce";
    str[8] = "i = 1.l, 1.f; beer";

    //char str[] = "a = 2.b, 1.d, 3.d; 4.o; milk cheese";

    int i;
    for (i=0; i<9; i++){
        makeStruct(*str);

    }

  return 0;
}

Итак, как вы можете видеть, я пытаюсь взять str[0], вывести выписку, которую я печатаю, и затем повторить процесс, используяцикл для передачи str[1], str[2], str[3], и т. д. и т. д. и т. п.

Итак, как правильно инициализировать массив, содержащий несколько строк, и затем передать эти строки в мою функцию makeStruct?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Попробуйте

 void makeStruct(char* str[],int number_of_strings){
       ...
    }

, затем получите доступ к каждой строке с помощью

 char * a = str[i];

i в диапазоне от 0 до number_of_strings-1

0 голосов
/ 12 октября 2018

Когда вы делаете это в исходном коде:

char str[] = "a = 2.b, 1.d, 3.d; 4.o; milk cheese";

Вы создаете массив char и инициализируете его содержимым данной строковой константы.Это хорошо, потому что даже если строковый литерал нельзя изменить str просто содержит копию содержимого этого строкового литерала.

Но когда вы сделаете это:

char *str[9];
str[0] = "a = 2.b, 1.d, 3.d; 4.o; milk cheese";
str[1] = "b = 2.a, 1.e, 2.c; water juice drinks";
...

Вывы создаете массив из указателей и присваивает каждому из этих указателей адрес строкового литерала.Поэтому, когда вы передаете *str в вашу функцию, она пытается изменить строковый литерал с помощью функции strtok, что недопустимо.

Вместо этого вам следует создать двумерный массив char, инициализированный строкойконстанты:

char str[9][50] = {
    "a = 2.b, 1.d, 3.d; 4.o; milk cheese",
    "b = 2.a, 1.e, 2.c; water juice drinks",
    "c = 2.b, 1.f; chips snacks",
    "d = 1.a, 1.g; bread cereal pasta",
    "e = 1.h, 1.b; meat chicken fish",
    "f = 1.i, 1.c; oils sauces condiments",
    "g = 1.j, 1.d; soup canned_goods",
    "h = 1.k, 1.e; produce",
    "i = 1.l, 1.f; beer"
};

Кроме того, ваш цикл всегда отправляет первый элемент массива:

for (i=0; i<9; i++){
    makeStruct(*str);
}

Индексирует массив для передачи в последовательные элементы:

for (i=0; i<9; i++){
    makeStruct(str[i]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...