Ввести в одну строку несколько полей одной записи - C (СИ)

Узнай цену своей работы

Формулировка задачи:

запись имеет структуру
   struct mess{
     char text[51];
     char data[11];
     int id;
   };
поле text имеет пробелы... поэтому вводить через scanf нельзя... а использовать puts тоже так как она автоматически переводит на след строку курсор

Решение задачи: «Ввести в одну строку несколько полей одной записи»

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;
}

Объяснение кода листинга программы

  1. Ввод данных осуществляется в одну строку.
  2. Программа считывает строку, ожидая заполнения полей записи.
  3. Проверяет корректность заполнения полей:
    • Проверка длины поля data.
    • Проверка наличия и корректности поля text.
    • Проверка длины поля text.
    • Проверка корректности формата ввода числового идентификатора.
  4. При некорректном заполнении полей выводит сообщение об ошибке и пропущенную запись.
  5. После завершения ввода выводит список заполненных записей.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.5 из 5
Похожие ответы