В общем, вопросы "помогите мне с моим кодом" не относятся к теме 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, поэтому здесь не может использоваться.