Do tipo "guarda-chuva"? É uma palavra só, não?
Existe algum limite para o tamanho de cada palavra?
Isso é contornável...
Mas isso você já sabia...=P
Se ó não conta, então a maior palavra (em portugues) que seu EP poderá pegar é Pneumoultramicroscopicossilicovulcanoconiose, que é o nome da doença...
Pneumoultramicroscopicossilicovulcanoconiosefobiafobia.
Por outro lado, o estudo dessa reação é a disciplina de Pneumoultramicroscopicossilicovulcanoconiosefobiafobialogia.
Etc.
Mas pensando bem acho que acabo de descobrir que tenho claustrofobiafobia, pois pessoas incomodadas no elevador me incomodam... Algum claustrofobiafobiólogo poderia confirmar isso para mim?
Entonces, quanto à maldade do professor. Ela se estenderá até arquivos de tamanho superior a 10^7 bytes? [buscando algum tratamento de erro que foge à minha imaginação]
Ah! Lembrei! Não existe o link para o EP3 a partir da página da disciplina. [ok, não faz diferença alguma, mas fica bonitinho]
Quanto a maldades, o limite 10^7 foi colocado para facilitar a vida. Se alguém quiser fazer um programa que rode sem limitações, fique à vontade; vou preparar testes para esses também. Mas para satisfazer os requistos do EP, basta ficar dentro das limitações.
Segundo o todo poderoso Google, essa é a maior palavra do mundo:
lopadotemamachoselachogaleokranioleipsanodrimhypotirmmatosilphio
paraomelitokatakechymenokichlepicossyphophattoperisteralektryonopte
kephalliokigklopeleiolagoiosiraiobaphetraganopterygon.
Tem 182 caracteres e é o nome de UMA COMIDA grega!
... pensei em você, Lucas... hauhauahuahauhauhauha...
Abraço!
1) O usuário não sabe a localização da barra de espaço, nem vai digitar nenhum caractere não-numérico ou
2) O usuário é o nosso querido amigo Felipe Solferini, sempre disposto a buscar entradas que literalmente destruam os nossos programas.
"Debug is on the table!"
Eu não sou tão bom assim em criar entradas caóticas, mas pretendo ser. Me disseram que se voce digitar Santiago na rede linux ela trava.
Experimentei-a com alguns caracteres não-ascii (char c, com 127 < c < 255) e ela também retornou 1.
Nota: usei o GCC 3.4.2 (mingw-special).
pode usar tolower(caracter)?
Senão é só improvisar um
#define tolower(x) ((x)-'A'+'a')
e já era...
"k(espaço)-->(espaço)count"???
Professor!!!
Feliz dia dos professores para o senhor ^^
= P
Tentei executá-lo com o sudo e também retornou "Killed".
Ta bom, num deu. Hehehe!
Analisando bem, eu conheço outro vírus.
Dado que alguns vírus contaminam outros computadores, enxem a capacidade de armazenamento do pc hospedeiro e tornam o sistema instável, o Santiago é um vírus. =P
Abraço!
=P
Quando esse tipo de variável precisa alocar um tamanho muito grande de memória, usá-la como variável global não compromete a stack e assim não causando um segfault na sua cara. Caso você queira ainda deixar seu vetor dentro do main, uma solução técnica alternativa é usar nos parâmetros de compilação -OX, onde X é inteiro e 0<X<5 , que eles identificam trechos que podem comprometer a stack e retiram em algum passo da compilação essa variável de dentro da função e coloca-a como variável global.
Outra solução é aumentar o tamanho alocado para a stack. No linux, você pode ver o tamanho da sua stack usando o comando 'ulimit -a' e mudando o valor usando 'ulimit -s <tamanho em kbytes>', mas não recomendado caso você não saiba o que está fazendo. Como para o EP não vai ser possível essa solução, aconselho a só tomar como cultura adicional.
Mais informações:
procurar por stack, stack overflow, stack smashing, buffer overflow, propolice, ulimit.
Links:
http://en.wikipedia.org/wiki/Stack-smashing_protection#GCC_Stack-Smashing_Protector_.28ProPolice.29
http://en.wikipedia.org/wiki/Buffer_overflow#Stack-based_exploitation
http://www.trl.ibm.com/projects/security/ssp/
http://doc.bughunter.net/buffer-overflow/smash-stack.html
Até!
eu estava usando uma string pra guardar palavras em um loop, então no fim do loop eu dava free(), só que quando eu mallocava essa mesma string denovo ela vinha com caracteres a mais de outras vezes que ela foi usada
demorei pra descubrir o erro mas só tirei o free() e ta funcionando....
alguem sabe o pq disso??
Acho que não sei usar essa função direito.
#include <stdio.h>
#include <ctype.h>
int main() {
int estado;
estado = isalpha ("1");
printf ("%d\n", isalpha);
return 0;
}
#include <stdio.h>
#include <ctype.h>
int main() {
int estado;
estado = isalpha ("1");
printf ("%d\n", estado);
return 0;
}
continua no SF
isalpha recebe um caractere, não uma string, este é o motivo do SF.
Se você colocar o nome da função como argumento de printf, sairá na tela o endereço que isalpha tomou no seu programa sem resultar num SF.
Quanto à saída, eu posso formatar como foi proposto no enunciado?
Digo:
Usar na primeira linha o k --> count...
Depois usar %7d como formatação?
Você roda seu programa com aspa dupla no argumento de isalpha? Se for isto está errado, é com aspa simples.
Se fosse count --> k, as pessoas entenderiam a saída mais facilmente...
Isso é um erro?
(pois, há dois caracteres 'D' como palavras).
No entanto, como D é o último caractere antes do EOF, ele me parece contar " D[EOF]" como uma palavra diferente de " D " (mas pelo critério do isalpha, isso não deveria acontecer).
Quanto ao wc, foi falha minha, ele retornou corretamente.
Enfim:
arquivo: out
saída esperada:
1 -> 1745874
2 -> 1
saída obtida:
1 -> 1745875
(testes realizados no zillertal)
Por motivos de força maior (do Paca), tive de colocá-lo em minha página pessoal:
http://www.linux.ime.usp.br/~gnann/out.zip
Aqui vai o resultado de processar seu arquivo:
progs] > time countw <out
1 -> 1745874
2 -> 1
real 0m2.647s
user 0m2.380s
sys 0m0.036s
Vou verificar se o executável que coloquei na página está bugado; eu fiz umas alterações no programa de pois de postar, mas acho que o código que garante que esse bug não ocorra está lá desde o começo.
(Na realidade, eu só não sei porque deu diferença entre compilar cá e lá...)
Posso usar a função setlocale para resolver o problema da acentuação?(setlocale é ANSI e está definido em <locale.h>)
Até!
setlocale(LC_ALL, "");
Assim, quem manda é o ambiente, e o monitor, ao corrigir, pode forçar a barra para o progama se comportar de um jeito pré-fixado.
Dá para fazer de forma simples um programa que presume que todo caractere ocupa um byte. É o que foi pedido. Sem muito trabalho, é possível tornar o programa sensível à localização - desde que ainda 1 byte/caractere. Por exemplo, todos os locales iso-8859-x. Agora, se for para lidar com caracteres de tamanho variável, como utf-8 e Unicode, é preciso usar toda uma biblioteca diferente para tratamento dos caracteres.
Corrigindo: isalpha retorna um valor diferente de 0 para todos os caracteres acentuados, exceto o ÿ.
Usando o setlocale do modo que o professor escreveu, isalpha retorna diferente de 0 para um conjunto de caracteres maior que o [a-z] e [A-Z] pois o zillertal esta configurado como pt_BR.iso88591 o que ajuda muito.
Professor, tinha me referido com "grupos de caracteres" às listas de caracteres de cada locale (o nome certo é 'collation'?).
Quanto à mensagem do Geraldo, tinha me gerado a dúvida e depois eu vi a resposta do professor e embolou tudo...
Vou usar o setlocale mesmo. Acho que se pegar para os textos em português só texto em japonês vai dar problema! Hahaha!
man 7 locale
é o ponto de partida para mais informação.
Pode usar as funções do ctype.h além da isalpha?
Pela contagem do exemplo isso não deveria acontecer. u.u
Troquei == 1 por != 0 e funcionou (e eu não sei explicar o porquê).
Ah é, sem contar que o windows b retornava 1024 para caracteres pequenos e não 1.
eu tenho que tratar o caso de nenhum arquivo ser passado via pipe?
Porque, por exemplo no meu caso, getc lê como scanf se isso acontece. Sei lá, fica estranho. Pelo menos, fica como curiosidade.
Seria bom se tivesse um "!stdin", hahaha!
1- a atual
A gente não vai usar, na linha de comando, "programa < arquivo.txt" ? Isso faz o arquivo entrar pela stdin, não?
Mas no caso em que usemos só "programa", não tem arquivo! E aí? O programa vai ter que rodar ou a gente dá printf("Dá um arquivo pra eu ler")?
2 - a nova
Tô fazendo o meu EP pra funcionar para o set da ISO-8859-1. Vou cumprir o objetivo do EP? Aliás, percebi que ele vai dar um bom tradutor de miguxês, ahahaha!
Valeu! =D
Ao usar o '<' voce redireciona um arquivo para a entrada padrao, entao se tenho um arquivo assim :
teste 1
ao fazer programa < arquivo ,
é o mesmo que fazer :
programa ( enter )
teste 1 ( enter )
ou seja, seu programa fica esperando voce digitar até que acabem as entradas que ele esperava, caso voce queira enviar um EOF, basta digitar (CTRL+d) .
2. ...
No linux, pode-se alterar o ambiente de um programa com o comando env. Assim, se seu programa for sensível ao local, as chamadas
terão "opiniões" diferentes sobre o que é palavra, mas vai ser tudo por conta do isalpha.
Troquei o programa-exemplo que estava na página do enunciado por um sensível ao local. A única modificação no programa-fonte foi a inclusão de duas linhas de código
nos lugares apropriados.