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 № 1Você 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