Ввести в одну строку несколько полей одной записи - C (СИ)
Формулировка задачи:
запись имеет структуру
поле text имеет пробелы... поэтому вводить через scanf нельзя... а использовать puts тоже так как она автоматически переводит на след строку курсор
struct mess{ char text[51]; char data[11]; int id; };
Решение задачи: «Ввести в одну строку несколько полей одной записи»
textual
Листинг программы
#include <stdio.h> typedef struct { char text[51]; char data[11]; int id; } mess_t; int main( void ) { #define RECORDS_MAX_COUNT 32 mess_t records[ RECORDS_MAX_COUNT ]; size_t records_count = 0, i; while( records_count < RECORDS_MAX_COUNT ) { char buffer[64]; printf( "\nid (data) \"text\"\n>" ); if( 2 > strlen( fgets( buffer, 64, stdin ) ) ) // пустая строка означает прерывание ввода break; // ------- проверить длину даты ---------- char * begin = strchr( buffer, '(' ); if( !begin ) { printf( "Error: data field is not found!\n" ); continue; } char * end = strchr( begin, ')' ); if( !end ) { printf( "Error: data field is not terminated!\n" ); continue; } if( end - begin != 9 ) { printf( "Error: data field should be exactly 8 symbols long (got %d)\n", end - begin - 1 ); continue; } // ------- проверить длину текста ---------- if( !(begin = strchr( buffer, '\"' )) ) { printf( "Error: text field is not found!\n" ); continue; } if( begin < end ) { printf( "Error: data field should be before text!\n" ); continue; } if( !(end = strchr( begin + 1, '\"' )) ) { printf( "Error: text field is not terminated!\n" ); continue; } if( end - begin >= 51 ) { printf( "Error: text field is too long!\n" ); continue; } // -------- распарсить -------------------- sscanf( buffer, "%d (%[^)]) \"%[^\"]\"\n", &(records[ records_count ].id), records[ records_count ].data, records[ records_count ].text ); records_count++; } puts( "\ndata:\n" ); for( i = 0; i < records_count; i++ ) printf( "#%d | %d | '%s' | '%s'\n", i, records[ i ].id, records[ i ].data, records[ i ].text ); return 0; }
Объяснение кода листинга программы
- Ввод данных осуществляется в одну строку.
- Программа считывает строку, ожидая заполнения полей записи.
- Проверяет корректность заполнения полей:
- Проверка длины поля
data
. - Проверка наличия и корректности поля
text
. - Проверка длины поля
text
. - Проверка корректности формата ввода числового идентификатора.
- Проверка длины поля
- При некорректном заполнении полей выводит сообщение об ошибке и пропущенную запись.
- После завершения ввода выводит список заполненных записей.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д