Problemas ao prencher string com laço for em C [RESOLVIDO]

1. Problemas ao prencher string com laço for em C [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 25/11/2018 - 10:14h

Olá, recetemente andei fazendo uns testes com strings em C e acabei me deparando com um problema esquisito. O problema....estou com preguiça de descrever (- É SERIO ISSO?), então só vou deixar o código abaixo para vocês examinarem e darem o veredito.

Eis o código:

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

void get_string(char *__string, size_t max){

fgets(__string, max, stdin);

size_t len=strlen(__string);

if(__string[len-1]=='\n'){

__string[len-1]='\0'; //Tira a quebra de linha (o '\n').
}
}

int main(void){

char secret_word[56];

printf("\n[?] secret_word >");
get_string(secret_word, 56);

size_t wordlen=strlen(secret_word);

char secret[wordlen+1];

printf("\n\n[I] secret_word.........: %s\n", secret_word);
printf("[I] secret_word lenght..: %ld\n\n", wordlen);

for(size_t i=0; i<wordlen; i++){

if(secret_word[i]!=' '){

secret[i]='-';

}else{

secret[i]=' ';
}
}

secret[wordlen+1]='\0';

printf("[I] secret..........: %s\n", secret);
printf("[I] secret lenght...: %ld\n\n", strlen(secret));

return 0;
}




zherkezhi@zherkezhi-Lenovo-B40-30:~/Documents$ ./app

[?] secret_word >abacaxi


[I] secret_word.........: abacaxi
[I] secret_word lenght..: 7

[I] secret..........: -------
[I] secret lenght...: 7

Até aqui beleza!


zherkezhi@zherkezhi-Lenovo-B40-30:~/Documents$ ./app

[?] secret_word >macaco


[I] secret_word.........: macaco
[I] secret_word lenght..: 6

[I] secret..........: ------
[I] secret lenght...: 6

Até aqui beleza de NOVO!


zherkezhi@zherkezhi-Lenovo-B40-30:~/Documents$ ./app

[?] secret_word >azeitona


[I] secret_word.........: azeitona
[I] secret_word lenght..: 8

[I] secret..........: --------4
[I] secret lenght...: 9


UAI! achei que AZEITONA tinha 8 letras *_*

zherkezhi@zherkezhi-Lenovo-B40-30:~/Documents$ ./app

[?] secret_word >ilha da macacada


[I] secret_word.........: ilha da macacada
[I] secret_word lenght..: 16

[I] secret..........: ---- -- --------&#65533;
[I] secret lenght...: 17


Dá onde saiu aquele último caracter? Nem era para estar ali!

Onde está o problema? O QUE DIABOS FIZ DE ERRADO ;( ?


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 25/11/2018 - 11:33h

zherkezhi escreveu:

Olá, recetemente andei fazendo uns testes com strings em C e acabei me deparando com um problema esquisito. O problema....estou com preguiça de descrever (- É SERIO ISSO?), então só vou deixar o código abaixo para vocês examinarem e darem o veredito.

Eis o código:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void get_string(char *__string, size_t max){

fgets(__string, max, stdin);


Considere a possibilidade de fgets() falhar. Se ela falhar, o código abaixo pode ser perigoso, pois você não sabe com que conteúdo __string vai ficar.

O certo seria você fazer algo como o seguinte.
	if(fgets(__string, max, stdin)){
/* Código se a leitura for bem sucedida. */
}
else {
/* Código se a leitura tiver dado erro. */
}


Considere também a possibilidade de fazer sua função retornar um valor que indique se ela conseguiu ler alguma coisa ou não, a fim de que que a chamar possa decidir como proceder em caso de erro.


size_t len=strlen(__string);

if(__string[len-1]=='\n'){

__string[len-1]='\0'; //Tira a quebra de linha (o '\n').
}
}

int main(void){

char secret_word[56];

printf("\n[?] secret_word >");
get_string(secret_word, 56);

size_t wordlen=strlen(secret_word);

char secret[wordlen+1];

printf("\n\n[I] secret_word.........: %s\n", secret_word);
printf("[I] secret_word lenght..: %ld\n\n", wordlen);

for(size_t i=0; i<wordlen; i++){

if(secret_word[i]!=' '){

secret[i]='-';

}else{

secret[i]=' ';
}
}

secret[wordlen+1]='\0';


Por que esse “+1”? Se você declarou com tamanho N, os índices vão de 0 a N-1.


printf("[I] secret..........: %s\n", secret);
printf("[I] secret lenght...: %ld\n\n", strlen(secret));

return 0;
}


3. Re: Problemas ao prencher string com laço for em C [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 25/11/2018 - 15:51h

@Paulo - Put4 retardado mental que eu sou!
Valeu ai Paulo! Mal posso acreditar que errei por causa de algo tão básico.