Как @KillianG. уже ответил, похоже, что вы, возможно, замутили проблему для себя, определив и использовав тип String
. В общем, определение типов, маскирующих природу указателя, как правило, более вредно, чем полезно.
Я думаю, что самая глубокая проблема здесь в том, что вы определили свою структуру данных иначе, чем вы собирались сделать. Учитывая тип
typedef char* String;
Вы можете написать код, подобный этому ...
String a_name = "Alice";
... но ваша структура не аналогична:
typedef struct{
String Name[10];
String ID[6];
float yo;
}data;
Вы определили элемент Name
как массив из String
s , то есть десять указателей, тогда как кажется вероятным, что вместо этого вам нужен массив char
, подходящий для хранения одного Строка C:
typedef struct {
char Name[10];
char ID[6];
float yo;
} data;
В качестве альтернативы, возможно, вы хотите, чтобы Name
была единственной строкой, и в этом случае вы должны объявить ее следующим образом:
String Name;
// equivalent to: char *Name;
Нет необходимости или возможности устанавливать максимальную длину строки в последнем случае, потому что такая вещь не является атрибутом char *
; длина строки C является функцией символьных данных, а не массива, содержащего их.
Предположим, вы идете с первой альтернативой,
char Name[10];
Теперь вам нужно учитывать тот факт, что C не предоставляет оператора для копирования всего массива. В частности, левый операнд оператора =
не может быть целым массивом. Вместо этого вы можете заполнять массивы поэлементно или с помощью различных функций, имеющих этот эффект (memcpy
, memmove
). Существует подсемейство таких функций, специфичных для копирования строковых данных: strcpy
, strncpy
, и т. Д. .. Учитывая, что строка ( не String
! ) "Charles"
известно, что требуется только 8 символов, включая его терминатор, идиоматический способ скопировать эти данные в существующий элемент Name
объекта data
будет через strcpy()
:
data user[3][3];
// This:
strcpy(user[0][0], "Charles");