/ / read () stdin em c? - c, entrada, stdin

read () stdin em c? - c, entrada, stdin

Eu tenho uma pequena pergunta rápida envolvendo o comando read ().

Eu estou realmente enferrujado em C e, infelizmente, minha tarefa atual me tem programado em C. Precisamos ler stdin usando o read () e não fgets e afins.

Então eu tenho um loop while simples:

int n, i;
char buffer[257], *input;

while((n=read(fileno(stdin), buffer, 256)) > 0)
{
buffer[n] ="";
if(buffer[n] = "n") break;
write(input, buffer, strlen(buffer));
}

Então, não tenho certeza de como fazer esse loop parar ao pressionar enter (fim de linha), então é por isso que eu tenho o código de quebra, embora eu não saiba se isso é feito corretamente.

Todo o objetivo que estou tentando realizar é colocar a entrada de stdin no ponteiro "input"

(Eu sou muito ruim em entender os ponteiros, então fique comigo :))

Meu problema é que estou recebendo falhas de segmentação quando pressiono enter. Eu gostaria de poder usar fgets porque então tudo isso seria resolvido com um simples

input = fgets(buffer, 256, stdin);

Darn lição de casa :( De qualquer forma, se algum de vocês poderia me apontar na direção certa, eu realmente aprecio isso. Obrigado!

Respostas:

2 para resposta № 1

Você está indo tudo errado. write é uma chamada de sistema usada para gravar em um descritor de arquivo aberto. Seu input não é nada disso - um descritor de arquivo é obtido chamando o open syscall primeiro, ou referindo-se a um dos arquivos sempre abertos, por exemplo stdin, stdout ou stderr. Sem mencionar que um descritor de arquivos é um int no Linux.

Além disso, você deve lembrar que a suposição de sua opinião sobre stdin terminar com uma nova linha não tem que estar certo o tempo todo. Seu programa pode receber algum conteúdo na entrada padrão que não contém nenhuma nova linha, por exemplo, conteúdo de algum arquivo (redirecionado para stdin), ou a entrada do teclado pode simplesmente terminar com Ctrl-D (EOF) em vez da tecla "return".

Além de tudo isso, um ponteiro não inicializado não se refere a nenhuma memória válida. A declaração de char *input não lhe dá o direito de escrever / ler a memória referida por input a menos que você aloque alguma memória para a qual esse ponteiro apontará primeiro.

Copiar strings em C é obtido usando funções declaradas em <string.h>. Eles operam em cadeias C, e. seqüências de caracteres terminados por . Nesse caso, read() não termina sua saída por um , nesse caso você vai querer usar o memcpy função em vez disso. Por que você simplesmente não tenta ler diretamente para input, Apesar? Não faz muito sentido ler para buffer primeiro, simplesmente para copiar os dados para outro pedaço de memória mais tarde.

Além disso, a especificação de read afirma que lê até contagem bytes do descritor de arquivos. O que significa que se o seu buffer é declarado como char[257]então você deve ligar read(stdin,buffer,257), não 256. Provavelmente também seria mais adequado simplesmente declarar o buffer como uma matriz de 256 elementos.

Espero ter endireitado algumas coisas para você.


0 para resposta № 2

Seu input dosn "t point anywhere valid. Você precisa alocar alguma memória (e liberá-la quando estiver pronto) ou fazer com que ela aponte para um armazenamento válido.

Além disso = é atribuição; == é comparação.