2015-10-16 2 views
0

Вероятно, это действительно глупый вопрос, ноВозвращающиеся Структуры

У меня есть массив структур за пределами ИНТ главного

typedef struct{ 
    char c; 
    int k; 
}factor_t; 

и я объявил

factor_t *factors = malloc(INIT*sizeof(*factors)); 

где INIT составляет 10

После выполнения моей функции у меня есть массив структур, каждый из которых содержит char, c, и целое число, k - например, factors[5].c может провести "b" или "d" или "e" и factors[5].k могли держать "3" или "33" или "333"

мне нужно каким-то образом вставить их в строку, но я не могу показаться, чтобы

strcat(destination,c or k); 

они оба дают мне указатель на целое число ошибок, назначения является char*

Как бы идти о вводе их в строку? Я с целью получить строку, которая выглядит как

ck 
ck 
ck 

то есть образец "ck\n" на структуры, где c = голец и k = целое

я использую strcat(destination, "\n"); для \n и он работает, но я не могу сделать то же самое с c и k

+1

Факторы [5] .c могут содержать «b» ... «Нет! 'факторы [5] .c' содержит' 'b''. Если вы не видите разницу, прочитайте о символьных константах и ​​строковых литералах. И 'факторы [5] .k' содержат' 333', а не '' 333 "'. – Olaf

+0

Просто быстро прочитал, извините, это - мое плохое. –

+0

Возможный дубликат [Создание форматированных строк C (не распечатывание)] (http://stackoverflow.com/questions/804288/creating-c-formatted-strings-not-printing-them) –

ответ

2

Для этого вы можете использовать sprintf. -

size_t len=strlen(destination);   // calculate before concatenation 
sprintf(&destination[len], "%c%d\n", factors[5].c,factors[5].k); // string with newline 

destination должен быть типа char *.

+0

Этот коэффициент перезаписывает 'destination' не конкатенировать. – MikeCAT

+0

@MikeCAT Хмм, строка с символом новой строки? Что он будет делать с этим. – ameyCU

+0

@chux Ohh, извините. Ошибка. Полностью забыл, что при наборе текста. Спасибо за указание. – ameyCU

2

Рассчитать длину строки и вывести ее с помощью этого смещения.

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

typedef struct{ 
    char c; 
    int k; 
}factor_t; 

void struct_cat(char *str, factor_t f) { 
    sprintf(str + strlen(str), "%c%d", f.c, f.k); 
} 

int main(void) { 
    factor_t fac = {'b', 33}; 
    char buf[100] = "hogehoge"; 
    struct_cat(buf, fac); 
    puts(buf); 
    return 0; 
} 
+0

следует знать, что 'buf [100]' может быть недостаточно большим для хранения всех значений: 10 * минимум 3 символа (например, '' a'' + ''1'' +'' \ n''), с максимум 12 символов ('' a'' + ''2147483647'' (' INT_MAX') + '' \ n'') -> вам, вероятно, понадобится 'buf [121]' быть в безопасности –

2

strcat добавляет копию исходной строки в строку назначения. Он ожидает c быть нулем строка не один char

Если вы хотите добавить один char в массив, который больше, чем n и нулевой завершающий символ имеет индекс n

destination[n] = c; 
destination[n+1] = '\0; 

вам должны быть уверены, что destination достаточно большой.

Если вы хотите форматировать печати дополнительные данные в строку назначения, снова убедитесь, что место назначения является достаточно большим и сделать:

sprintf(destination + n, "%c%d\n", c, k); 

Или, если вы знаете, как это назначение имеет m символов осталось:

snprintf(destination + n, m, "%c%d\n", c, k); 

При этом, если вы попытаетесь напечатать более m символов, дополнительные будут отбрасываться.

1

Если вам нужна отдельная функция использования функции (например, @MikeCAT). Но использование snprintf() и strncat() не позволяет выйти за границы массива:

void strncat_struct(char *buffer, size_t buffer_size, factor_t f) 
{ 
    char tmp_buf[32]; 
    snprintf(tmp_buf, sizeof(tmp_buf), "%c, %d\n", f.c, f.k); 
    strncat(buffer, tmp_buf, buffer_size); 
} 

int32_t main(int32_t argc, char **argv) 
{ 
//... 
    char buffer[256] = {0}; 
    for(i = 0; i < INIT; i++) { 
     strncat_struct(buffer, sizeof(buffer), factors[i]); 
    } 
//... 
} 

без использования дополнительных функций. Теоретически быстрее, couse не нужно вычислять длину строки:

int32_t main(int32_t argc, char **argv) 
{ 
//... 
    char buffer[256]; 
    char *buf_ptr = buffer; 
    size_t buf_size = sizeof(buffer); 
    for(i = 0; i < INIT; i++) { 
     int32_t printed; 
     printed = snprintf(buf_ptr, buf_size, "%c, %d\n", factors[i].c, factors[i].k); 
     buf_ptr += printed; 
     buf_size -= printed; 
    } 
//... 
} 
Смежные вопросы