Возможно, вы делаете вещи намного сложнее для себя, чем нужно. Заполнив struct Person
, для получения нужного результата вам просто нужно вывести элементы структуры, разделенные comma
и space
. Подойдет простой printf
, например,
struct Person p1 = { "John", "Doe", "831.563.3642" };
...
printf ("%s, %s, %s", p1.first, p1.last, p1.phone);
Вывод выше будет:
John, Doe, 831.563.3642
Вы никогда не сможете сделать char new[] = "";
- что создает массив new
размером 1 с символом '\0'
. (неправильный выбор имен, new
- это ключевое слово в C ++, его использование в качестве имени переменной следует избегать). Как только вы объявляете и инициализируете массив с помощью automati c длительность хранения размера 1 - его размер равен FIXED - точка и не может быть расширена. Вам нужно было бы динамически выделить хранилище с помощью malloc
, чтобы иметь возможность изменить размер хранилища позже с помощью realloc
.
Если вы хотите создать дополнительный массив, содержащий значения, разделенные запятыми, то вам необходимо объявите массив с хранилищем для хранения самых больших first_name, last_name
и phone
изначально, например char buf[100 + 100 + 13 + 4];
(+4 для пары ", "
, которую вы также хотите вставить) Теперь вы можете использовать sprintf
для простой записи в новый массив.
Ниже приведен короткий пример, который показывает как прямой вывод с printf
, так и создание нового массива (buf
) с использованием sprintf
. Результаты одинаковы независимо от того, выводите ли вы значения, разделенные запятыми, напрямую или сначала сохраняете их в буфере. Функция csvperson()
принимает массив назначения и указатель на заполненную структуру в качестве параметра для записи членов структуры, разделенных запятой и пробелом, в массив, например,
#include <stdio.h>
#define MAXNM 100 /* if you need a constant, #define one (or mroe) */
#define MAXPH 13
typedef struct { /* using a typedef allows you to later omit the */
char first[MAXNM], /* 'struct' prefix in your declarations and */
last [MAXNM], /* parameter lists */
phone [MAXPH];
} person;
char *csvperson (char *dest, person *p)
{
if (!dest)
return NULL;
sprintf (dest, "%s, %s, %s", p->first, p->last, p->phone);
return dest;
}
int main (void) {
char buf[2 * MAXNM + MAXPH + 4];
person p1 = { "John", "Doe", "831.563.3642" };
printf ("direct output : %s, %s, %s\nbuffer output : %s\n",
p1.first, p1.last, p1.phone, csvperson (buf, &p1));
}
Пример использования / Вывод
$ ./bin/csvperson
direct output : John, Doe, 831.563.3642
buffer output : John, Doe, 831.563.3642
Просмотрите все и дайте мне знать, если у вас есть дополнительные вопросы.
Пример массива
Кому используя те же методы, что и выше, с массивом, вы должны сделать:
int main (void) {
char buf[2 * MAXNM + MAXPH + 4];
person p1[] = { {"John", "Doe", "831.563.3642"},
{"Jane", "Doe", "832.563.3643"},
{"Mary", "Jane", "303.331.3333"} };
int n = sizeof p1 / sizeof *p1;
for (int i = 0; i < n; i++)
printf ("\ndirect output : %s, %s, %s\nbuffer output : %s\n",
p1[i].first, p1[i].last, p1[i].phone, csvperson (buf, p1+i));
}
Вы можете просто использовать fprintf
для вывода в файл без предварительной буферизации, например,
fprintf (fileptr, "%s, %s, %s\n", p1[i].first, p1[i].last, p1[i].phone);
В общем, не беспокойтесь о комбинировании / объединении / et c .. вещей, которые вы можете просто записать (где бы это ни был файл, терминал и т. Д. c ..)