Моя конечная цель — инициализировать X.fmt
с помощью sprintf
. Мой первое решение предназначен только для изменения атрибута fmt, но это не сработало. Затем я установил параметр struct student_t &X, чтобы обновить структуру, но это тоже не сработало.
Вот мое первое решение:
char* fmt_str ( struct student_t X )
{
char *buf;
sprintf( buf, "%s|%s|%.2f",
X.id,
X.name,
X.gpa );
return (buf);
}
Мне нужна помощь, чтобы найти правильное решение для изменения атрибута fmt. Но решение, которое обновляет структуру, также принимается.
char *buf;
sprintf( buf, format, ...);
sprintf
требует указатель на буфер, в котором хранится результирующая C-строка.
Этот буфер должен быть достаточно большим, чтобы содержать результирующую строку.
Вы можете изменить сигнатуру метода, чтобы принять буфер для использования, например:
char* fmt_str(struct student_t X, char* buf) {
sprintf(buf, "%s|%s|%.2f", X.id, X.name, X.gpa);
return buf;
}
Или судя по вашему комментарию
My final goal is to initialize X.fmt
Вы можете передать X
по ссылке (как указатель вместо структуры) и изменить его .fmt
напрямую. Это, конечно, при условии, что результирующий char[]
достаточно велик для строки, которую вы в него записываете.
struct student_t {
const char* id;
const char* name;
const float gpa;
char fmt[1024];
};
char* fmt_str(struct student_t* X) {
sprintf(X->fmt, "%s|%s|%.2f", X->id, X->name, X->gpa);
return X->fmt;
}