Как обработать символ-разделитель в языке Си?
Мне нужно написать программу на языке Си, которая будет реализовывать основные операции табличных процессоров. Входными данными будут текстовые данные, считанные с .формат 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
Я работаю в этом бизнесе уже несколько десятилетий, и это новый термин для меня. Что такое "настольный процессор"?