Rafasp Postado Março 14, 2017 Denunciar Share Postado Março 14, 2017 #include <stdio.h> #include <string.h> int main() { char frase[50],l,p; int i; printf("Esse programa troca de uma frase um caractere existente por um caractere a sua escolha:"); printf("\n\nDigite a frase:"); gets(frase); printf("\n\nDigite uma letra existente na frase que voce deseja trocar:"); scanf("%c", &l); printf("\n\nDigite qual letra voce deseja substituir %c:", l); scanf("%c", &p); for(i=0;i<50;i++){ if(frase==l); frase=p; } printf("%s", frase); } Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 isrnick Postado Março 14, 2017 Denunciar Share Postado Março 14, 2017 Para postar códigos use a tag CODE apertando o botão <> no topo do campo de respostas, assim você preserva a formatação do código e evita que o fórum faça alterações nele. Por exemplo, o fórum "comeu" todos os [ i ] (sem espaços) do seu código pois no fórum isso é a tag para deixar o texto em itálico, então o texto do seu código está em itálico a partir do primeiro que foi encontrado (os demais apenas somem pq o texto já tá em itálico). Nos scanfs onde você quer obter as letras você precisa descartar o caractere nova linha ('\n'), Pois quando você digita E e aperta Enter o que tem na entrada padrão (stdin) é a string "E\n", o primeiro caractere é pego pelo seu scanf e armazenado na variável, mas o caractere nova linha fica na entrada padrão, e é entendido como o caractere a ser lido pelo próximo scanf e armazenado na outra variável. Para ler e descartar um caractere basta usar %*c na string do scanf, onde * indica que o dado obtido não será armazenado em nenhuma variável, ficando assim: scanf("%c%*c", &l); O outro problema no seu código é que tem um ponto e vírgula no fim desse if: for(i=0;i<50;i++){ if(frase[i]==l); frase[i]=p; } Então seu programa está substituindo todas as letras da frase pelo caractere na variável p, não apenas as iguais a letra na variável l (e como p tinha '\n' armazenado nela o resultado era uma string cheia de caracteres nova linha "\n\n\n\n[ ... ]\n\n\n\n\n" que era impresso no fim do programa). Então com isto corrigindo deve ficar assim: for(i=0;i<50;i++){ if(frase[i]==l) frase[i]=p; } Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Rafasp Postado Março 14, 2017 Autor Denunciar Share Postado Março 14, 2017 (editado) Meu caro fiz o que voce falou no programa e funcionou perfeitamente, minha duvida é a seguinte: como nao entendi direito a sua explicaçao pois nao sei o que significa stdin e essas coisas (meu professor nao explicou) a duvida que fica é porque apenas nesse programa deu esse erro? Pois ja fiz inumeros outros programas como exercicios e nunca algo parecido ocorreu. Obrigado Editado Março 14, 2017 por Rafasp Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Rafasp Postado Março 14, 2017 Autor Denunciar Share Postado Março 14, 2017 E se puder me ajudar numa coisa bem rápida também (amanha tenho prova entao ficarei muito agradecido); int total=0; while(frase2[total] != '\0') total++; qual a diferença do acima pra este int e=0; for(d=0;d<50;d++) if(frase2[d]!='\0'){ e++; } pois em um programa eu precisava do numero de caracteres de uma string e quando usei o for nao consegui de jeito nenhum dava errado mas apenas utilizando o while acima deu certo sendo que pra mim os 2 codigos acima são identicos na logica =). Entao porque o while funcionou e o for não??? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 isrnick Postado Março 14, 2017 Denunciar Share Postado Março 14, 2017 (editado) stdin é abreviação do inglês standard input, ou entrada padrão em português. Nesse caso trata-se do 'fluxo' de entrada de dados na forma de texto através do console (prompt de comando). São digitados caracteres no prompt, e esses caracteres podem ser processados pelas funções das bibliotecas padrão do C (stdio.h, stdlib.h, etc) e outras. A função scanf() por exemplo obtém todos os caracteres digitados na entrada padrão até a última vez que Enter foi pressionado, e as processa dependendo dos parâmetros passados para a função (Ex: "%c%*c", &l) transformando de texto para o tipo correto (%d para inteiro, %f para float, etc) e armazenando os valores nas variáveis fornecidas. Mas o que não for utilizado pela função scanf fica lá na entrada padrão (se você digitar mais do que os parâmetros indicados na função esperam, por exemplo) podendo ser utilizados posteriormente por qualquer outra função de captura de entrada. A tecla Enter também produz um caractere quando pressionado, o caractere nova linha '\n', você certamente já usou esse caractere várias vezes no printf(). Então quando você aperta E e depois Enter você coloca 2 caracteres na entrada 'E' e '\n', mas os scanfs no seu programa estão esperando capturar caracteres (%c), e o caractere nova linha é um caractere, então o primeiro scanf armazenaria o caractere 'E' na variável l, e o scanf seguinte guardará o caractere '\n' na variável p, que quando combinado com erro do ; no IF gerou aquele resultado do seu programa original. A diferença dos seus programas anteriores é que provavelmente você não estava lendo caracteres no scanf, mas sim inteiros ou números com ponto flutuante (float), e apesar do caractere nova linha ainda estar lá sobrando na entrada, ele era ignorado pois os scanfs procurariam apenas números, não qualquer caractere. Quanto a sua pergunta: Aqui: int total=0; while(frase2[total] != '\0'){ total++; } Você começa a contagem em 0, e o while continua procurando até achar o caractere nulo '\0' que é o caractere que indica o fim da string.Pois em C toda string termina no caractere nulo (portanto um vetor de caracteres de comprimento 50 só pode armazenar uma string de até 49 caracteres não nulos, pois nesse caso a última posição do vetor deverá armazenar o caractere nulo). E no final terá o comprimento da string armazenado na variável total. Entretanto aqui: int e=0; for(d=0;d<50;d++){ if(frase2[d]!='\0'){ e++; } } d vai de 0 até 50, sempre indo até a última posição do vetor. Vamos supor que você declarou o vetor "char frase2[50]", o que significa que você alocou memória para armazenar os dados desse vetor, mas lá nesse espaço da memória já tinha alguma informação já que foi usada por algum outro programa anteriormente, e agora é nada mais que lixo. Você então usa um scanf para armazenar uma frase nesse vetor, por exemplo "abcde", então as 6 primeiras posições do vetor serão ocupadas por essas 5 letras mais o caractere nulo '\0', mas observe que o restante do vetor não foi alterado, ainda contém qualquer bobeira que já estava lá. Seu programa vai sair contando todos os caracteres no vetor inteiro que são diferentes de '\0', contando até qualquer coisa que está armazenada lá em cada um do resto das posições do vetor como sendo um caractere (dependendo pode até coincidentemente ter algum que tá com um 0 lá e não será contado). Logo, o resultado muito provavelmente dará errado. O modo correto de fazer o mesmo que o while no primeiro código usando for seria: int e; for(e=0; frase2[e]!='\0'; e++); ou para usar as mesmas variáveis: int total; for(total=0; frase2[total] != '\0'; total++); Editado Março 14, 2017 por isrnick Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Rafasp Postado Março 14, 2017 Autor Denunciar Share Postado Março 14, 2017 Voce é o cara!! Muito obrigado! Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Rafasp
#include <stdio.h>
#include <string.h>
int main()
{
char frase[50],l,p;
int i;
printf("Esse programa troca de uma frase um caractere existente por um caractere a sua escolha:");
printf("\n\nDigite a frase:");
gets(frase);
printf("\n\nDigite uma letra existente na frase que voce deseja trocar:");
scanf("%c", &l);
printf("\n\nDigite qual letra voce deseja substituir %c:", l);
scanf("%c", &p);
for(i=0;i<50;i++){
if(frase==l);
frase=p;
}
printf("%s", frase);
}
Link para o comentário
Compartilhar em outros sites
5 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.