Dúvida Cabeluda no scanf se alguém souber? [RESOLVIDO]

1. Dúvida Cabeluda no scanf se alguém souber? [RESOLVIDO]

Mr.Perfection
perfection

(usa Slackware)

Enviado em 19/03/2020 - 23:31h

Boa Noite a todos, dessa vez estou com uma dúvida que para mim se tornou sem saída. E eu gostaria muito de resolver!
Estou usando o scanf para capturar o Texto. Optei dessa forma pq não sei o tamanho de texto, então assim ele captura qualquer tamanho
scanf("%m[^\n]", &Texto); 

Acontece que usando [^\n] ele não está capturando as outras linhas obviamente! E Texto pode ter 50 linhas por exemplo!
Não tenho como definir um Caracter para ele parar!

Como funciona: Dentro do Editor Geany, Eu seleciono o Texto e envio para o programa através da opção commands do Geany.
Então meu programa captura automáticamente!
Então não sei o que posso colocar no scanf ou se substituo ele por outra coisa que não faço idéia!

Sei que a função main pode ter parâmetros, mas até nisso fiquei sem saída. Eu uso assim o main
int main(int IndexParametro, char *Parametro[]) { 

Só que não consigo jogar o texto como Parametro, porque a única forma que sei fazer é: ./MyProgram Bom Dia
O Problema é que não tenho como escrever isso, porque o Geany apenas executa o que programei no Atalho: ./MyProgram
Além do que uso no Atalho parâmetros para definir o retorno do Texto como por exemplo: ./MyProgram ou ./MyProgram -d
Não seria problema se eu consegui-se que o Texto ficasse após o -d mas não tenho idéia de como enviar isso pro meu programa!
Acredito que o Geany envie o texto para uma saída, motivo pelo qual o scanf pega. Lembrando que não existe pra mim Terminal neste caso.

OBS O Comando sort ele consegue capturar tudo! Mas não faço idéia de como ele faz isso! Alguma Luz?

Alguém tem alguma idéia para isso?




  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/03/2020 - 10:27h

Nunca usei Geany (e, com todo o respeito, não vou instalá-lo só para responder a uma dúvida surgida on-line). Mas, que eu me lembre de outros IDEs que usei ao longo da vida, geralmente existe uma opção para definir argumentos do programa, que é uma coisa diferente da entrada do programa (pelo que eu entendi da sua mensagem, você está redirecionando a entrada).

Não sei se entendi bem sua dúvida, mas me parece que você quer capturar toda a entrada para uma única variável, até não sobrar nada. Se esse for o caso, você pode trabalhar com um conjunto que, em lugar de excluir o caráter '\n', inclua todos os caracteres (por exemplo: scanf("%m[\0-\377]", &Texto)).

Note, porém, que ler tudo para a memória sempre é algo temerário, pois mais cedo ou mais tarde vai aparecer uma entrada tão grande que vai consumir toda a memória.

Se, por outro lado, você não quiser esgotar a entrada, mas ler até determinado ponto, então possivelmente você terá de ir lendo aos pouquinhos (por exemplo: de linha em linha ou de caráter em caráter) e fazendo os testes para ver se já se alcançou a condição de parada, e acrescentar o texto recém-lido ao final daquilo que já fora lido anteriormente.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)

3. Re: Dúvida Cabeluda no scanf se alguém souber?

Mr.Perfection
perfection

(usa Slackware)

Enviado em 20/03/2020 - 13:25h

paulo1205 escreveu: me parece que você quer capturar toda a entrada para uma única variável, até não sobrar nada. Se esse for o caso, você pode trabalhar com um conjunto que, em lugar de excluir o caráter '\n', inclua todos os caracteres (por exemplo: scanf("%m[\0-\377]", &Texto)).

SUPER, SUPER, Brilhante Idéia, Obrigado por dar um caminho...

Entendi que esse scanf varre toda a tabela ASCII. Porém o problema é que ele retorna: (null) usando printf("RESULT: %s\n", Texto);
O Problema esté entre 0 e 31 então começando pelo LF(Line Feed) fiz:
scanf("%m[\10-\377]", &Texto); 

E SIM Pegou tudo e Funcionou... Agora eu só preciso fazer mais testes, ter 100% de certeza que isso poderá ser usado!
Mais uma vez, SUPER Obrigado Paulo...
Porque eu não conhecia o scanf que vc apresentou, o máximo que eu achava possível era usando letras,
algo do tipo: scanf("%m[0-9a-zA-Z ]", &Texto);
Não fazia idéia que podia usar decimais da tabela ASCII


4. Re: Dúvida Cabeluda no scanf se alguém souber? [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/03/2020 - 14:17h

Oops! Falha minha. Eu devia ter me tocado que, ao embutirum '\0' dentro da string, mesmo sendo explícito sobre ele, ele seria interpretado pelo scanf() como uma marca de fim de string. Você pode trocá-lo por um '\1'.

O problema é que isso vai excluir o byte nulo e, como você não conhece a entrada de antemão, não pode ter certeza de que nunca haverá tal byte na entrada para ser consumido.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts