Как установить значения из символа токена в этот массив под названием customerData [] [] в C? - PullRequest
0 голосов
/ 18 января 2020

Я только начал изучать C язык, и мне нужна помощь с программой. Вот код.
Вопросы:

  1. Что это? customerData [NUM_FIELDS] [FIELD_LENGTH];
  2. Это массив 2D символов?
  3. Как вы вводите данные в массив? fget C, путчар, гетчар?

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


#define INPUT_LENGTH 128 
#define FIELD_LENGTH 30 
#define NUM_FIELDS   9 

    int main()
    {   
       FILE *data=NULL; 
       char input[INPUT_LENGTH];
       char customerData[NUM_FIELDS][FIELD_LENGTH];

       int element=0;
       char *next;
       char ch;

       data= fopen("data.txt","r");
       if(data!=NULL)
       {
          //token=strtok(input,"|");

     /*while loop will go through line by line and stored it in an input array*/ 
          while(fgets(input,INPUT_LENGTH,data)!= NULL)
          {
             next=strtok(input,"|");
             while(next!=NULL)
             {  
                 //ch=getchar()
                 //>probably a get char for ch  
                 strcpy(next,customerData[element][strlen(next)]);
                 /*need to put the values into customer data one by one*/
                 printf("%s\n",next);
                //element+=1; 

                next=strtok(NULL,"|");

             }
    //element=0;
          } 


          printf("program is done\n");

       } 
       fclose(data);
       return 0; 
    }


1 Ответ

0 голосов
/ 18 января 2020

В общем, вопросы "помогите мне с моим кодом" не относятся к теме c в переполнении стека. Для того, чтобы оставить вопрос в топиках c, я сосредоточусь только на вопросе о том, как получить доступ к двумерным массивам символов.

Да, это массив двумерных символов. Или, другими словами, это массив с NUM_FIELDS элементами, где каждый элемент массива является массивом char с FIELD_LENGTH элементами.

Существует множество способов вставить данные в 2D-массив символов , но, вероятно, есть два, с которыми я сталкивался чаще всего. Какой из них вы выберете, будет зависеть от того, как вы хотите думать об этом массиве.

Вариант 1: двумерный массив из отдельных символов

Первый способ думать об этой переменной просто 2D массив символов - сетка элементов, к которым вы можете получить доступ. Здесь вы можете просто ввести значения, используя обычный оператор присваивания. Вы захотите убедиться, что ваши индексы находятся в диапазоне, или вы начнете получать доступ к недопустимой памяти.

//Set a known element that's definitely in range
customerData[1][2] = 'A';

//Loop through all the elements
for(int ii = 0; ii < NUM_FIELDS; ii++)
{
    for (int jj = 0; jj < FIELD_LENGTH; jj++)
    {
        customerData[i][j] = 'B';
    }
}

//Set an element from variables
char nextInput = getNextCharFromInput();

if(x < NUM_FIELD && y < FIELD_LENGTH)
{
    customerData[x][y] = nextInput;
}

//Bad. This could corrupt memory
customerData[100][60] = 'X';

//Risky without check. How do you know x and y are in range?
cusomterData[x][y] = 'X';

Вы наверняка могли бы написать свой код, назначая эти элементы символу за раз. Тем не менее, более широкий контекст вашей программы в значительной степени указывает на то, что следующий параметр лучше.

Вариант 2: одномерный массив строк фиксированной длины

In C, строка " «это просто набор символов. Таким образом, другой способ взглянуть на эту переменную (и тот, который имеет наибольшее значение для этой программы) - это обработать ее как одномерный массив длины NUM_FIELDS, где каждый элемент представляет собой строку длины FIELD_LENGTH.

Looking таким образом, вы можете начать использовать строковые функции C для ввода данных в массив, а не обрабатывать их по буквам. Как и прежде, вы все равно должны быть осторожны с длинами, чтобы вы не go от конца строк.

Также помните, что весь массив распадается на указатели, так что char* также является строкой (только неизвестной длины).

//Set a specific field to a known string, which is short enough to fit
strcpy(customerData[2], "date");

//Loop through all fields and wipe their data
for(int ii = 0; ii < NUM_FIELDS; ii++)
{
    memset(customerData[ii], 0, FIELD_LENGTH);
}

//Set field based on variables
if(x < NUM_FIELDS)
{
    //Will truncate next if it is too long
    strncpy(customerData[x], next, FIELD_LENGTH);

    //Will not input anything if field is too long
    if(strlen(next) < FIELD_LENGTH)
    {
        strcpy(customerData[x], next);
    }
}

//Bad. Could corrupt memory
strcpy(customerData[100], "date");
strcpy(customerData[1], "this string is definitely much longer than FIELD_LENGTH");

//Risky. Without a check, how do you know either variable in in range?
strcpy(customerData[x], next);

getchar и fget C оба имеют дело с чтение символы из stdout и файла соответственно, поэтому их нельзя использовать для помещения данных в переменную. putchar имеет дело с положением персонажа в вещи, но только с stdout, поэтому здесь не может использоваться.

...