Как удалить пустые элементы из массива строк в C? - PullRequest
1 голос
/ 23 апреля 2020

Я работал над вводом файлов. Я хотел сохранить каждую строку как строку в массиве. Например: если файл имеет строки:

This is line 1.
This is line 2.
This is line 3.

Строка должна содержать:

char str[][] = {"This is line 1.", "This is line 2.", "This is line 3."};

Когда я пробовал с лишними пробелами:

This is line 1.


This is line 2.
This is line 3.

Вывод был в том же формате. Я хочу удалить эти лишние пустые строки из моего массива предложений, чтобы вывод был таким же, как и раньше. Как мне это сделать?

[EDIT] Я использую следующие l oop для ввода предложений из файла в массив:

while (fgets(str[i], LINE_SIZE, fp) != NULL)
{
    str[i][strlen(str[i]) - 1] = '\0';
    i++;
}

1 Ответ

2 голосов
/ 23 апреля 2020

Вы должны использовать промежуточный одномерный массив символов при вызове fgets, как, например,

for ( char line[LINE_SIZE]; fgets( line, LINE_SIZE, fp) != NULL; )
{
    if ( line[0] != '\n' )
    { 
        line[ strcspn( line, "\n" ) ] = '\0';
        strcpy( str[i++], line );
    }
}

Если строка может содержать пробелы, вы можете изменить условие оператора if следующим образом

for ( char line[LINE_SIZE]; fgets( line, LINE_SIZE, fp) != NULL; )
{
    size_t n = strspn( line, " \t" );

    if ( line[n] != '\n' && line[n] != '\0' )
    { 
        line[ n + strcspn( line + n, "\n" ) ] = '\0';
        strcpy( str[i++], line );
    }
}

В приведенном выше фрагменте кода вы можете заменить этот оператор

strcpy( str[i++], line );

на этот оператор, если хотите, чтобы строка не содержала начальных пробелов.

strcpy( str[i++], line + n );
...