Problemas ao lerr matriz de string com fgets()? [RESOLVIDO]

1. Problemas ao lerr matriz de string com fgets()? [RESOLVIDO]

Jefferson Willans
jerequinho

(usa Ubuntu)

Enviado em 03/06/2015 - 16:11h

Olá galera, sou um iniciante na programação e estou tendo problemas ao fazer um exercício. Eu preciso criar um programa que leia vários parágrafos e logo após a leitura, os imprima e imprima a primeira entrada ao fim do laço, que acaba quando se digita "FIM". Entretanto, estou tendo problemas ao tentar fazer isso: o programa continua exibindo dados da primeira entrada, que vão diminuindo gradualmente.
Segue o código:

:#

O que eu estou fazendo de errado?
Desde já, obrigado.


  


2. Re: Problemas ao lerr matriz de string com fgets()? [RESOLVIDO]

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 03/06/2015 - 17:16h

Boa tarde,

Segue o código comentado e com as devidas alterações.


/* c/vol_forum/printstr.c
* Thread: http://www.vivaolinux.com.br/topico/C-C++/Problemas-ao-lerr-matriz-de-string-com-fgets/
*
* Author: Enzo Ferber <enzoferber@gmail.com>
* Date : 03 Jun 2015
*
* Generated by: STARK Framework v1.0.3
* Module : Forum Code Extracter
* Version: 0.1
*/

#include <stdio.h>
#include <string.h>

int main()
{
int i = 0;
/* isso declara um array de 1000 elementos, cada um com tamanho de
* 999 char's.
*/
char p[1000][999];

do {
/* aqui, voce le cada elemento em seu correspondente i.
* Vale observar que o valor maximo que voce coloca esta errado,
* pois a string podera conter, no maximo, 999 caracteres.
* Entao, ao inves de 1000, devera ser 999.
*/
fgets(p[i], 999, stdin);

/* A indexagem para puts() esta errada. O erro de compilacao que
* te levou a colocar o & foi provavelmente algo como "puts espera um
* argumento do tipo (char *), nao (char).
*
* O problema e que a indexacao que voce usou nao esta correta.
* Para imprimir o elemento, basta usar a mesma referencia que
* utilizou em fgets, ou seja, p[i].
*
* Para imprimir o primeiro caractere do array, voce utiliza
* p[i][0].
*
* O modo como voce usou, esta sempre imprimindo o proximo caractere
* do primeiro elemento do array (p[0])
*/
puts(p[i]);

/* quanto a finalizacao do loop, ja que uma string seja digitada,
* voce pode utilizar a funcao padrao strcmp(), que retornara
* zero caso a comparacao seja verdadeira.
*
* Ou seja,
*
* strcmp (p[i], "FIM") == 0, termina loop.
*/

/* Uma pequena nota sobre fgets. fgets() vai ler e armazenar todos
* os caracteres ate uma nova linha (\n), inclusive.
* Por isso, a string sera
* 'F' 'I' 'M' '\n' '\0'
*
* strlen("FIM") retornara 4, e nao 3.
*
* Isso fara com que strcmp() nao funcione corretamente, para isso,
* consertaremos assim:
*
* p[i][ strlen(p[i]) - 1 ] = 0x0
*/
p[i][ strlen(p[i]) - 1] = 0x0;

} while ( strcmp (p[i++], "FIM") );
/* uma nota sobre o porque incrementar o i dentro de strcmp().
*
* Ja que precisamos comparar o elmento atual (i), se voce incrementar
* o contador la em cima, precisara utilizar (i - 1) como indexador
* em todos os casos aqui em baixo. Para clareza, podemos utilizar
* p[i++], que ira acessar o elemento p[i], realizar a comparacao e so
* depois ira incrementa-lo.
*/

/* Aqui, novamente, o compilador deve ter reclamado (ver explicacao acima)
* e voce utilizou o &.
*
* puts(&p[0][0]);
*
* Para imprimir a primeira string, utilize p[0].
* puts (p[0]);
*/

puts (p[0]);
return 0;
}


Qualquer coisa posta denovo,
Enzo Ferber
[]'s



$ cat codigo.c | indent -kr -i8
$ man indent

"(...)all right-thinking people know that (a) K&R are _right_ and (b) K&R are right." - linux/Documentation/CodingStyle - TORVALDS, Linus.



3. Re: Problemas ao lerr matriz de string com fgets()? [RESOLVIDO]

Jefferson Willans
jerequinho

(usa Ubuntu)

Enviado em 04/06/2015 - 18:02h

Valeu cara, deu tudo certo e consegui atingir meu objetivo. Mas agora, quero contar o número de caracteres em todos parágrafos e estou tendo um problema ao tentar fazer isso.

Eu aumentei o número de char's para 1000, criei um vetor para armazenar o número de ocorrência de cada caractere (A a Z e 0 a 9) e zerei cada uma de suas posições. Com o laço verifico a se o caractere é presente em cada char de todas posições.
Porém, não recebo a resposta correta.

:)

Fiz tudo do jeito que considero mais fácil, mas já estou há bastante tempo tentando ver o que fiz de errado e simplesmente não consigo identificar nada. :((((


4. Re: Problemas ao lerr matriz de string com fgets()? [RESOLVIDO]

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 05/06/2015 - 08:07h

Bom dia.

O que você está querendo fazer é um analisador de frequência.

Tá no caminho certo, então não vou postar códigos, só pedaços...

Primeiro, strlen():

for (i = 0; i < strlen(str); i++)
...

Não usamos i <= strlen(str) para iterar sobre a string. Se você fizer isso, o último valor de i vai apontar para o caractere NULL '\ 0' que termina toda string. E isso não é necessário.

Segundo, switch:
Para um analisador de frequências, você não precisa utilizar um switch. É melhor utilizar um hash. E a impletação de hashes com caracteres em C é elementar:

/* O tamanho é 255 pois a tabela ASCII possui 255 caracteres. */
int hash[255];
char *str;

...

fgets (str...);

...

/* zera os contadores do hash */
for (i = 0; i < 255; i++ )
hash[ i] = 0x0;

/* incrementa os contadores baseados nos caracteres da string */
for (i = 0; i < strlen(str); i++)
hash[ str[ i] ]++;



Uma dica: Fazer do jeito que estava fazendo (com um array de 36 elementos) é mais complicado, por causa dos condicionais que você precisara colocar e da conversão de caracteres (maiúsculos->minúsculo). Eu acho melhor utilizar o hash com 255 elementos e imprimir só os que você quer.

Uma outra dica: os caracteres que representam números começam no index 48 (0x30). As letras maiúsculas no 65 (0x41) e as minúsculas no 97 (0x61).

Tabela ASCII:

/* c/ascii.c
* Print ASCII Table.
*
* Author: Enzo Ferber <enzoferber@gmail.com>
* Date : 05 Jun 2015
*
* Generated by: STARK Framework v1.0.5
* Module : CODE
* Version: 1.0
*/
#include <stdio.h>

int main (void)
{
register int i;

for (i = 0; i < 255; i++)
printf ("%-3d %-3x %-3c\n", i, i, i);

return 0;
}



Espero ter ajudado,
Qualquer coisa posta denovo,
Enzo Ferber
[]'s


$ cat codigo.c | indent -kr -i8
$ man indent

"(...)all right-thinking people know that (a) K&R are _right_ and (b) K&R are right." - linux/Documentation/CodingStyle - TORVALDS, Linus.





5. Re: Problemas ao lerr matriz de string com fgets()? [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 05/06/2015 - 08:23h

Se você fizer um cálculo usando letras, você não precisa desse monte de ifs.
Usa subtração de caracteres.
Por exemplo, letra='D' resula em letra-'A' = 3.
Você faz essa continha para o índice do array e fica automático

Outro exemplo, letra='r' resula em letra-'a' = 17.
Mas conforme o rapaz escreveu acima, você pode evitar essas verificações e usar array de 0 a 255.
Para isto você coloca a variável da letra no índice do array que ele entende.
Por exemplo: array[letra]++

--
Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts