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;
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top