В C, как я могу распечатать массив символов, а затем очистить его после? - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь прочитать строку файла в строке и проверить, есть ли какие-либо метки, которые записаны в виде " label: ".Он проверяет наличие точки с запятой и практически просто добавляет символы перед точкой с запятой в массив символов temp.Затем очищает temp и использует функцию fgets для чтения следующей строки.

Это код, который я написал до сих пор:

char temp[200] = "";

    while(fgets(line, len, fp) != NULL)
    {
        for(int i = 0; i < strlen(line); i++)
        {
            if (line[i] == ' ') continue;
            else if(line[i] != ' ' && line[i] != ':')
            {
                append(temp, line[i]);
                continue;
            }
            else if (line[i] == ':')
            {
                printf("Scanned label %s\n", temp);
                char temp[200] = "";
            }
        }
    }

и append - это специальная функция, используемаядля добавления отдельных символов в массив символов temp

void append (char* str, char ch)
{
    int len = strlen(str);
    str[len] = ch;
    str[len+1] = '\0';
}

В четырех строках текстового файла имеется одна метка для каждой строки.Вот пример входного файла:

L1: this is a sentence
L2: this is another sentence
L3: this is another sentence
L4: this is the last sentence

Мне удалось получить вывод

Scanned label
Scanned label
Scanned label
Scanned label

Но, как вы видите, я не могу распечатать содержимое массива символовtemp.Итак, мой вопрос заключается в том, что, если есть что-то, что я могу это исправить, или есть какие-то логические недостатки в моем коде?

А что касается очистки массива символов, то, что я сделал правильно?Просто просто:

char temp[200] = "";

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Это не делает то, что вы ожидаете:

else if( ( line[i] != ' ' || line[i] == ':') && (line[i] == '\0'))

Это условие будет истинным, только если line[i] является завершающим нулевым байтом, поэтому единственное, что вы добавите в строку, это,Вы хотите добавить, если вы получаете не пробел или не :.Вы делаете это так:

else if( ( line[i] != ' ' && line[i] != ':'))

Тогда есть эта часть:

        else if (line[i] == ':')
        {
            printf("Scanned label %s\n", temp);
            char temp[200] = "";
        }

Строка, читающая char temp[200] = "";, не очистка temp, определенная вверхней части блока, но создает новую переменную с именем temp.Эта переменная сразу выходит из области видимости, поэтому не имеет никакого эффекта.Затем вы продолжите добавлять к temp для каждой метки, заканчиваясь "L1L2L3L4".

Чтобы сделать temp пустой строкой, просто установите для первого элемента значение 0:

        else if (line[i] == ':')
        {
            printf("Scanned label %s\n", temp);
            temp[0] = '\0';
            break;
        }

Обратите внимание, что мы break вне внутреннего цикла, поэтому мы можем прочитать следующую строку.

0 голосов
/ 24 февраля 2019

Нет необходимости «очищать» временный массив.

А что касается очистки массива символов, то, что я сделал правильно?Просто просто: char temp[200] = "";

Достаточно просто использовать char temp[200]; при инициализации.Второе объявление внутри оператора if совершенно неверно.Просто удалите его.

Другие замечания:

(line[i] != ' ' || line[i] == ':') всегда будет иметь значение true.Вы должны рассмотреть это условие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...