LINUX.ORG.RU

Почему ломается строка?

 


0

1
<...>
typedef struct
{
	int   index;
	char  com1[3];
	char  type1;
	char  val1[8];
	char  type2;
	char  val2[8];
} src_line;

typedef struct
{
	int_var*  INTEGER;
	int       integer_size;
	
	flt_var*  FLOAT;
	int       float_size;
	
	str_var*  STRING;
	int       string_size;
	
	src_line* SOURCE;
	int       src_count;
} _warehouse;

_warehouse warehouse;

int add_source_line(char line[255])
{
	/*    ФОРМАТ КОМАНДЫ
	┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐
	│N ││N ││N ││  ││C ││C ││C ││  ││T ││  ││V ││V ││V ││V ││V ││V ││V ││V ││  ││T ││  ││V ││V ││V ││V ││V ││V ││V ││V │
	└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘
	┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐
	│00││01││02││03││04││05││06││07││08││09││10││11││12││13││14││15││16││17││18││19││20││21││22││23││24││25││26││27││28│
	└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘ */
	
	warehouse.SOURCE = realloc(warehouse.SOURCE, (++warehouse.src_count) * sizeof(src_line));
	
	char str[3];
	
	strncpy(str, line, 3);
	sscanf(str, "%X", &warehouse.SOURCE[warehouse.src_count - 1].index);
	strncpy(warehouse.SOURCE[warehouse.src_count - 1].com1,  line + 4, 3);
	
	printf("%s\t", warehouse.SOURCE[warehouse.src_count - 1].com1);
	
	warehouse.SOURCE[warehouse.src_count - 1].type1 = line[8];
	strncpy(warehouse.SOURCE[warehouse.src_count - 1].val1,  line + 10, 8);
	warehouse.SOURCE[warehouse.src_count - 1].type2 = line[19];
	strncpy(warehouse.SOURCE[warehouse.src_count - 1].val2,  line + 22, 8);
	
	//printf("%i\t", warehouse.SOURCE[warehouse.src_count - 1].index);
	printf("%s\t", warehouse.SOURCE[warehouse.src_count - 1].com1);
	//printf("%c\t", warehouse.SOURCE[warehouse.src_count - 1].type1);
	//printf("%s\t", warehouse.SOURCE[warehouse.src_count - 1].val1);
	//printf("%c\t", warehouse.SOURCE[warehouse.src_count - 1].type2);
	//printf("%s", warehouse.SOURCE[warehouse.src_count - 1].val2);
	
	printf("\n");
	
	return 1;
}

Первый printf выводит правильно считанные 3 символа. Второй printf говорит, что com1 поглотил весь остальной остаток строки.

Почему так и как исправить?

★★★

Последнее исправление: AlexCones (всего исправлений: 1)

char com1[3];

А куда \0 девать? Похоже, printf, не находя завершающего нуля, выводит и дальше всякий мусор, пока на него не наткнется.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Добавил единичку ко всем таким строкам (com1[4]). Заработало. Правда я так и е понял, почему это канало при первом printf.

AlexCones ★★★
() автор топика
Ответ на: комментарий от AlexCones

Потому что там может находиться что угодно. В том числе и нули.

tensai_cirno ★★★★★
()
Ответ на: комментарий от AlexCones

Если бы com1 был в конце структуры и выравнивание бы не использовалось, было бы более забавно.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от AptGet

Это случайно

С чего вдруг? Формат строки известен, все данные распределяются нормально.

А что, есть кто-то, кто может гарантировать забивание перераспределенной памяти нулями?

AlexCones ★★★
() автор топика

warehouse.SOURCE = realloc(warehouse.SOURCE, ...);

А еще вот тут есть ненулевая вероятность потерять указатель на блок памяти.

AptGet ★★★
()
Ответ на: комментарий от AlexCones

strncpy(warehouse.SOURCE[warehouse.src_count - 1].com1, line + 4, 3);

С чего вдруг?

strncpy() копирует 3 символа, в 4м - мусор.

AptGet ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.