Como faço para obter um programa usando getchar para executar?
Pergunta
Eu sou um C N00B total tentando me ensinar C fora da K&R. Minha pergunta é meio embaraçosamente elementar. Ok, aqui vai: não consigo obter programas usando getchar para fornecer o tipo de saída que eu esperava. Se você tiver K&R na mão, estou preso no Exercício 1.13. A pergunta diz: "Escreva um programa para imprimir um histograma dos comprimentos das palavras em sua entrada". E eu não consigo nem abordar a versão horizontal por causa desse problema que estou tendo.
Estou no XP usando o Dev-C ++ (Mingw Compiler) e executando programas da linha de comando. Meu problema é que, quando tento executar meu programa, ele espera que eu digite os personagens para escanear, mas quando estou com a entrada de e pressionados, ele não faz nada. Espero que ele vá em frente e imprima o histograma, como eu esperava. Na realidade, ele nem parece contar comprimentos de palavras, porque como você pode ver no código, quando tento imprimir o que está na matriz CTR apenas para ver se ela contém alguma coisa, nada imprime.
Sou tão N00B que não tenho ideia se é o meu código ou a linha de comando que é culpada. Mas suspeito que seja algo com o sistema, porque quando tento compilar e correr um programa modelo, a mesma coisa acontece. Digite a entrada, pressione Enter, nada acontece. Se eu ctrl-C, às vezes ele cospe um asterisco ou dois que não se parecem com a saída do modelo. Outras vezes, ele não faz nada (apenas volta ao prompt).
Aqui está o meu código para o exercício. Passei um dia inteiro nisso e estou questionando minha capacidade de continuar com a programação. Eu realmente aprecio isso se alguém pudesse me tirar desse buraco!
Além disso, tenho outra pergunta sobre o programa de modelo que mencionei acima, mas acho que devo publicá -lo em sua própria pergunta. Obrigado a todos :)
#include <stdio.h>
//#define 1 IN
//#define 0 OUT
int main () {
//start w/ state = OUT
int c = 0;
// int state = OUT;
int len = 0;
int ctr[12];
int i, j;
i = j = 0;
for (i = 0; i <12; i++)
ctr[i] = 0;
while ((c = getchar()) != EOF)
if (c != ' ' && c != '\t' && c != '\n') {
// state = IN;
len++;
printf("%d", len);
}
else {
ctr[len]++;
len = 0;
}
for (i = 0; i <12; i++)
printf("%d\n", ctr[i]);
for (i = 0; i <12; i++) {
printf("%d\n", i);
for (j = 0; j <= ctr[i]; j++)
printf("-");
printf("\n");
}
return 0;
}
Solução
Seu loop while está procurando o EOF, que significa o final do arquivo, e não o fim da linha.
No Windows, você precisa digitar Ctrl-Z para simular o final do arquivo.
Outras dicas
Não parece que você está realmente armazenando C (sua entrada) em nenhum lugar ... nem imprimindo. Você está imprimindo o tamanho da string, mas não os caracteres reais. Se você ctr [i] = c; Em algum lugar (você está adicionando o personagem à matriz) e, em seguida, imprime a matriz, verá sua entrada. Ah, e sim, a resposta sobre Ctrl-Z também é importante. Além disso, se você é totalmente novo no idioma, eu recomendaria fortemente que você coloque suportes em volta do seu conteúdo. Vai demorar um pouco antes que você possa olhar para o código e saber o que cairá no alcance do While e o que não terá se você não tiver aparelho em torno dele.
Eu não vi nada realmente errado com o código, então o carreguei no GCC e parece funcionar bem, desde que você se lembre de que precisa colocar um EOF (CTRL-D) para encerrar o loop while. Entrei 4 linhas e, embora não possa fazer nenhuma declaração sobre a correção das respostas, cada vez que clico em Enter, recebi uma série de números iguais ao número de caracteres que eu digitei, seguido por um espaço. É exatamente isso que seu código diz para fazer.
Quando entrei no Ctrl-D, recebi as informações de resumo. Novamente, não vou fazer nenhuma declaração sobre a correção da saída, mas obtive duas seções principais, conforme descrito em seu código.