Ввести в одну строку несколько полей одной записи - 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. - Проверка корректности формата ввода числового идентификатора.
- Проверка длины поля
- При некорректном заполнении полей выводит сообщение об ошибке и пропущенную запись.
- После завершения ввода выводит список заполненных записей.