dwiogdw Ответов: 1

Как обработать символ-разделитель в языке Си?


Мне нужно написать программу на языке Си, которая будет реализовывать основные операции табличных процессоров. Входными данными будут текстовые данные, считанные с .формат txt файл, операции будут определены с использованием терминальных аргументов, а выходные данные будут находиться в .формат txt и файл тоже.

Программа должна быть запущена следующим образом:

./main [-d delimiter] [name of the function for the table] <in.txt >out.txt


Где
-d
аргумент определяет, какие символы могут быть интерпретированы как разделители отдельных ячеек, по умолчанию
delimiter
это космический символ. Несколько случаев одного и того же знака в разделителе игнорируются. Первый знак в символе-разделителе будет использоваться в качестве разделителя выходных значений.
name of the function
это идентификатор функции, которая будет вызвана для выполнения определенных задач на таблице.
<in.txt
перенаправляет чтение с стандартный ввод к чтению от in.txt,
>out.txt
перенаправляет вывод на стандартный вывод для вывода на out.txt

Вот что я написал::

#include <stdio.h> 
#include <string.h>

int main(int argc, char* argv[]) 
{   
    if((argc > 2) && (strcmp(argv[1], "-d") == 0)) {
        char delim = *argv[2];  

        for (int i; (i = getchar()) != EOF; ) {
            if(i == '\n')
                putchar(i);


            if(!((i >= '0' && i <= '9') || (i >= 'a' && i <= 'z') || (i >= 'A' && i <= 'Z')) ){                          
                putchar(delim);
                continue;
            }
            putchar(i);
        }

    }


    else if((argc == 2) && strcmp(argv[1], "-d") == 0) {
        char delim = ' ';

        for (int i; (i = getchar()) != EOF; ) {
            if(i == '\n')
                putchar(i);

            if(!((i >= '0' && i <= '9') || (i >= 'a' && i <= 'z') || (i >= 'A' && i <= 'Z')) ){                          
                putchar(delim);
                continue;
            }
            putchar(i);
        }

    }


    return 0;
}


Код работает и делает то, что должен, но я не уверен в эффективности реализации. Требования таковы: входная таблица не может быть пустым файлом, максимальная длина строки (как входной, так и выходной) составляет 10 кб, в противном случае должно быть показано сообщение об ошибке. Использование глобальных переменных не допускается, макрос препроцессора
#define
является. Также не допускаются функции для работы с файлами и динамического выделения памяти.

Как я могу изменить свой код?

Что я уже пробовал:

#include <stdio.h> 
#include <string.h>

int main(int argc, char* argv[]) 
{   
    if((argc > 2) && (strcmp(argv[1], "-d") == 0)) {
        char delim = *argv[2];  

        for (int i; (i = getchar()) != EOF; ) {
            if(i == '\n')
                putchar(i);


            if(!((i >= '0' && i <= '9') || (i >= 'a' && i <= 'z') || (i >= 'A' && i <= 'Z')) ){                          
                putchar(delim);
                continue;
            }
            putchar(i);
        }

    }


    else if((argc == 2) && strcmp(argv[1], "-d") == 0) {
        char delim = ' ';

        for (int i; (i = getchar()) != EOF; ) {
            if(i == '\n')
                putchar(i);

            if(!((i >= '0' && i <= '9') || (i >= 'a' && i <= 'z') || (i >= 'A' && i <= 'Z')) ){                          
                putchar(delim);
                continue;
            }
            putchar(i);
        }

    }


    return 0;
}

Richard MacCutchan

Не совсем ясно, что именно должен делать этот код.

Rick York

Я работаю в этом бизнесе уже несколько десятилетий, и это новый термин для меня. Что такое "настольный процессор"?

1 Ответов

Рейтинг:
0

KarstenK

Ваш разделитель входит в качестве третьей команды argv и вы должны назначить его своему символу

char delim = argv[2];
Используйте отладчик, чтобы увидеть, что делает ваш код, наблюдая за некоторыми переменными.