Processando caracteres delimitadores em C?

Oct 17 2020

Escreva um programa C que implementará as operações básicas dos processadores de tabela.

A entrada será dados de texto lidos de um arquivo .txt , as operações serão definidas usando argumentos de terminal e a saída também será em um arquivo .txt .

O programa deve ser executado da seguinte maneira:

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

Onde o -dargumento determina quais símbolos podem ser interpretados como separadores de células únicas, por padrão delimiteré um caractere de espaço.

Vários casos do mesmo sinal no delimitador são ignorados.

O primeiro sinal no caractere delimitador será usado como separador de valores de saída.

name of the functioné o identificador da função que será chamada para realizar certas tarefas na mesa. <in.txtredireciona a leitura de stdin para leitura de in.txt , >out.txtredireciona a saída para stdout para a saída para out.txt.

Aqui está o que escrevi:

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

O código funciona e faz o que deveria, mas não tenho certeza sobre a efetividade da implementação. Os requisitos são: a tabela de entrada não pode ser um arquivo vazio, o comprimento máximo de uma linha (entrada e saída) é 10 KiB, caso contrário, uma mensagem de erro deve ser exibida. O uso de variáveis ​​globais não é permitido, mas a macro do pré-processador #defineé. Funções para trabalhar com arquivos e alocação de memória dinâmica também não são permitidas.

Quais são as maneiras de alterar meu código?

Respostas

3 pacmaninbw Oct 17 2020 at 22:21

Seria útil dividir o código em funções, o que simplificará cada tarefa.

Processe os argumentos da linha de comando primeiro e, em seguida, depois que o delimitador processe os arquivos de texto.

  1. Declare a variável delimacima de qualquer lógica e inicialize-a com o valor padrão
  2. Processe a linha de comando para obter o delimitador real.
  3. Processe o arquivo de entrada.

Isso deve encurtar o código porque você só precisa de um loop para processar o arquivo de entrada em vez de 2.