Aula de 2012 e me ajudou em 2021, PQP. Tive que fazer uma lista encadeada onde o usuário digitava o nome da música, a banda/cantor e a duração. Ele também tinha que ter a opção de digitar mais e depois listar todas a que ele digitou. Consegui fazer tudo até chegar nessa parte de string. Toda vez que eu fazia o printf_s, ou acontecia violação de memória ou exibia uns caracteres ÌÍÌÍÌÍÌÍÌÍÌÍÌÍÌÍ. Me ajudou demais cara, muito obrigado!!!
Italo, só faltou uma coisa nas aulas sobre entrada de strings, o formatador %[^ ], que recebe strings contendo espaço, não precisa fazer o ciclo while, se comporta de forma idêntica ao %s porém reconhece espaços, e para exibir no printf usa o %s mesmo. E aqui, nos scanf em string, quando coloco o & dá erro, para entrada de strings não usa-se o &. Ex: printf("Insira nome e sobrenome: "); scanf("%[^ ]",nome); printf("Seu nome e sobrenome: %s ",nome);
Essa aula ajudou e muito em um probleminha que eu estava, valeu e continue assim, nos oferecendo boas oportunidades de desenvolver nossa linha de logica. parabéns!
Era pra ser uma coisa tão simples, né? E a linguagem C dificulta algo tão banal... adorei sua solução. Deveria ter visto esse video quando eu estava sofrendo com o escondido do fgets, rs. Meu professor de estrutura de dados pede todo mês relatórios dos videos do seu canal. E eu passei em linguagem de programação por causa desses videos, se não... rs. Parabéns, seu curso de C é muito bom!
Também tem o "fgets", uso bastante ele porem há um problema na entrada de dados, quando você escreve um nome ou uma frase e em seguida você pressiona ENTER, ela pega o enter junto, como se fosse uma letra da frase, no caso ' ', mas pode ser resolvido com a função strlen, código em seguida: #include #include int main() { char nome[30]; fgets(nome,30, stdin); nome[strlen(nome)-1]='\0'; printf("%s", nome); return 0; }
Dessa maneira tudo fica mais simples !!! #include #include int main(){ char palavra[50]; printf("DIGITE SEU NOME: "); gets(palavra); printf(" O NOME DIGITADO FOI >> %s
Sim mano assim é mais fácil, mas ele fez daquela forma ai encima no vídeo, para ensinar a função getchar , e uma dica: a função gets ela não existe mais na ultima padronização que ouve em C, e substituída pela função fgets que faz a mesma coisa de gets e é mais confiavel, no casa do seu codigo ficaria assim: gets(palavra) // forma menos confiável & que não existe mais na ultima padronização fgets(palavra, 50, stdin) // Forma Correta & Mais confiavel
Rogerio Cruzz pelo pouco que eu sei, gets n é nem um pouco confiável por conta do Buffer Overflow, o transbordamento de dados. A função gets n limita o usuário a digitar uma quantidade maxima de caracteres, ou seja, ele pode simplesmente escrever 1000000 de caracteres, muito mais que o seu vetorzinho char[20], por exemplo, aguentaria. Dessa forma esses dados sobressalentes seriam alocados em espaços de memória adjacentes, o que convenhamos, é um probleminha de segurança.
Muito Obrigado!!!!! Era só isso que eu precisava, estava revirando a internet inteira e não achava. Quatro anos depois e ainda salvando vidas kkkkk,. Obrigadooo.
O "caractere" é necessário por causa do ciclo While. senão a repetição não acaba porque quando você da enter é adicionado ++i passando a não ser ' ' mas '\0'
Oi ítalo , sou novo no seu canal aqui e to curtindo muito apesar da minha dificuldade de assimilação , e entendo bem com vc explicando, pena q quando eu pego no pesado pra programar, da um branco eu esqueço tudo, acho que to dormindo pouco. Parabéns pelo trabalho. Mas vem cá, o que vc usa pra substituir os comandos system("pause") , system( "cls") e getch() quando necessário no Xcode Mac? To apanhando que dói em cada vez que possui um comando que não roda no Mac e Ródano Windows...
Dessa vez nessa aula não bugou, está ok, nem precisei digitar em baixo do while linha[i-1]='\0', porque no gcc deu certo e no seu dev que é desse jeito, mais mesmo digitando dá certo.
para solucionar os caracteres indesejados ao fim do programa, ao inves de [i-1] podemos alterar a condição do while colocando (caractere != '\0'), assim não precisamos alterar o valor do tamanho da linha, deixando linha [ i ].
Não sei o por quê, mas testei no meu compilador a dica do Lucas Divíno e não funcionou... deu certo apenas quando eu coloquei o código como o do vídeo...
Tenho uma dúvida, dentro de um vetor do tipo char eu posso colocar apenas 1 caractere índice do Vetor ou posso por palavras? Exemplo: Char X[10]; X[0] = "pao com mortadela";
Fiz sem o Do while e funcionou perfeitamente também: #include int main() { char phrase[100]; char word; int i = 0; while(word != ' '){ word = getchar(); phrase[i] = word; ++i; } printf("%s ",phrase); return 0; }
Ola, eu tenho acompanhado as aulas e tenho aprendido muito aqui. Mais estou com um problema, vou ate uzar o exemplo da aula, depois que eu uzo algum scanf no programa, ele ignora completamente o getchar ( to uzando o dev c++ e o code::blocks). #include main(){ char linha [100]; char caractere; int i=0,a; scanf("%i", &a); /* adicionei esse scanf aqui so para testar, e se eu escrever um numero, e der enter o programa termina e nao le do caractere=getchar() em diante (nem o printf la de baixo), mais se eu escrever um nome por exemplo ele captura a string normalmente e tipo que ignora o scanf*/ do{ caractere = getchar(); linha[i] = caractere; ++i; } while (caractere != ' '); linha [i-1] = '\0'; printf("%s ",linha); system("pause"); return 0; }
assim fica tudo mais fácil !!! #include #include int main(){ char palavra[50]; printf("DIGITE SEU NOME: "); gets(palavra); printf(" O NOME DIGITADO FOI >> %s
#include #include int main(void){ char linha[100]; char caractere; int i=0; do{ caractere=getchar();//Getchar funcao padrao da linguagem c linha[i]=caractere; ++i; // ela vai na linha de comando e pega 1 caractere }while(caractere!=' '); ++i; printf("%s ",linha); system("pause"); return 0; } Pode ser assim também ?
Eu utilizo outro método que acho bem mais fácil. Ex: main () { char nome[50]; printf("Digite seu nome completo. ==>"); fflush(stdin); gets(nome); // Ou também poderia ser usado da seguinte maneira: fgets(nome, 50, stdin); printf("Seu nome completo e: %s ", nome); }
Nao entendi a necessidade de fazer as atribuições: caractere = getchar( ); linha[i] = caractere; nao podia ter sido feito simplesmente: linha[i] = getchar(); ?? Obrigado!
Usei uma função parecida pra obter string mas preciso converter ela pra s1 e s2 pra usar como argumento para outra função. Sim, estou tentando juntar a matéria desse vídeo com a da aula 51. Pensei em usar algo assim para fazer isso obterString(); strcpy (s1, linha); obterString(); strcpy (s2, linha); Sendo linha o return da função de obter string. Claro que esse pedaço de código não funciona, botei ali pra dar ideia do que preciso fazer. Alguma ideia?
Amigo se eu quisesse imprimir uma palavra abaixo da outra apos cada espaço ex : digitar : pao com mortadela imprimir : pao com mortadela como faço ? Att;
Eu achei desnecessário esse ciclo do while, desse jeito roda do mesmo jeito: #include #include #include int main(){ char nome[50]; setlocale(LC_ALL,"portuguese"); printf("Digite seu nome: "); gets(nome); printf(" Seu nome é: %s
Aula de 2012 e me ajudou em 2021, PQP. Tive que fazer uma lista encadeada onde o usuário digitava o nome da música, a banda/cantor e a duração. Ele também tinha que ter a opção de digitar mais e depois listar todas a que ele digitou. Consegui fazer tudo até chegar nessa parte de string. Toda vez que eu fazia o printf_s, ou acontecia violação de memória ou exibia uns caracteres ÌÍÌÍÌÍÌÍÌÍÌÍÌÍÌÍ. Me ajudou demais cara, muito obrigado!!!
faço engenharia de computação na ufms e tendo programação... realmente seus vídeos possuem muita qualidade, abraços!!!
Italo, só faltou uma coisa nas aulas sobre entrada de strings, o formatador %[^
], que recebe strings contendo espaço, não precisa fazer o ciclo while, se comporta de forma idêntica ao %s porém reconhece espaços, e para exibir no printf usa o %s mesmo. E aqui, nos scanf em string, quando coloco o & dá erro, para entrada de strings não usa-se o &.
Ex: printf("Insira nome e sobrenome: "); scanf("%[^
]",nome); printf("Seu nome e sobrenome: %s
",nome);
Essa aula ajudou e muito em um probleminha que eu estava, valeu e continue assim, nos oferecendo boas oportunidades de desenvolver nossa linha de logica. parabéns!
Dps do Luciano do yt esse canal é o mais pika kraio!
Valeu pelo suporte!
Esse vídeo mudou minha vida!
sim sim.. você tem razão. não me lembro porquê na época fiz desse jeito hahaha..
O vídeo ajudou bastante! valeu!
Era pra ser uma coisa tão simples, né? E a linguagem C dificulta algo tão banal... adorei sua solução. Deveria ter visto esse video quando eu estava sofrendo com o
escondido do fgets, rs. Meu professor de estrutura de dados pede todo mês relatórios dos videos do seu canal. E eu passei em linguagem de programação por causa desses videos, se não... rs. Parabéns, seu curso de C é muito bom!
Pois é, não entendo o porquê desse
, poderia me explicar?
@@antonioalecioferreira7155 se eu n me engano é pula linha
Também tem o "fgets", uso bastante ele porem há um problema na entrada de dados,
quando você escreve um nome ou uma frase e em seguida você pressiona ENTER, ela pega o enter junto, como se fosse uma letra da frase, no caso '
', mas pode ser resolvido com a função strlen, código em seguida:
#include
#include
int main()
{
char nome[30];
fgets(nome,30, stdin);
nome[strlen(nome)-1]='\0';
printf("%s", nome);
return 0;
}
Dessa maneira tudo fica mais simples !!!
#include
#include
int main(){
char palavra[50];
printf("DIGITE SEU NOME: ");
gets(palavra);
printf("
O NOME DIGITADO FOI >> %s
",palavra);
system("pause");
return 0;
}
Sim mano assim é mais fácil, mas ele fez daquela forma ai encima no vídeo, para ensinar a função getchar , e uma dica: a função gets ela não existe mais na ultima padronização que ouve em C, e substituída pela função fgets que faz a mesma coisa de gets e é mais confiavel, no casa do seu codigo ficaria assim:
gets(palavra) // forma menos confiável & que não existe mais na ultima padronização
fgets(palavra, 50, stdin) // Forma Correta & Mais confiavel
Rogerio Cruzz pelo pouco que eu sei, gets n é nem um pouco confiável por conta do Buffer Overflow, o transbordamento de dados. A função gets n limita o usuário a digitar uma quantidade maxima de caracteres, ou seja, ele pode simplesmente escrever 1000000 de caracteres, muito mais que o seu vetorzinho char[20], por exemplo, aguentaria. Dessa forma esses dados sobressalentes seriam alocados em espaços de memória adjacentes, o que convenhamos, é um probleminha de segurança.
Muito Obrigado!!!!! Era só isso que eu precisava, estava revirando a internet inteira e não achava. Quatro anos depois e ainda salvando vidas kkkkk,. Obrigadooo.
@@rogeriocarvalho2248 esse 50 e referente ao que??
@@earthgamers252 Pode ser o tamanho do vetor
O "caractere" é necessário por causa do ciclo While.
senão a repetição não acaba porque quando você da enter é adicionado ++i passando a não ser '
' mas '\0'
Oi ítalo , sou novo no seu canal aqui e to curtindo muito apesar da minha dificuldade de assimilação , e entendo bem com vc explicando, pena q quando eu pego no pesado pra programar, da um branco eu esqueço tudo, acho que to dormindo pouco. Parabéns pelo trabalho.
Mas vem cá, o que vc usa pra substituir os comandos system("pause") , system( "cls") e getch() quando necessário no Xcode Mac? To apanhando que dói em cada vez que possui um comando que não roda no Mac e Ródano Windows...
Dessa vez nessa aula não bugou, está ok, nem precisei digitar em baixo do while linha[i-1]='\0', porque no gcc deu certo e no seu dev que é desse jeito, mais mesmo digitando dá certo.
Você saberia explicar por que quando eu substituo linha[i] = caractere por linha[i] = getchar() o resultado não é o esperado.
para solucionar os caracteres indesejados ao fim do programa, ao inves de [i-1] podemos alterar a condição do while colocando (caractere != '\0'), assim não precisamos alterar o valor do tamanho da linha, deixando linha [ i ].
🎉
Você gosta de Mortadela tanto assim??? :v :v :V
Si >:D
Acho mais facil fazer
scanf(" %[^
]"); ja evita varios erros de buff e um jeito mais confiável. Esse ciclo while vai aumentar o custo do programa
Usem:
scanf("%[^
]s"), -nome variavel-;
Vai capturar tudo do teclado até espaços e só para quando apertar ENTER.
Não sei o por quê, mas testei no meu compilador a dica do Lucas Divíno e não funcionou... deu certo apenas quando eu coloquei o código como o do vídeo...
Tenho uma dúvida, dentro de um vetor do tipo char eu posso colocar apenas 1 caractere índice do Vetor ou posso por palavras?
Exemplo:
Char X[10];
X[0] = "pao com mortadela";
Fiz sem o Do while e funcionou perfeitamente também:
#include
int main() {
char phrase[100];
char word;
int i = 0;
while(word != '
'){
word = getchar();
phrase[i] = word;
++i;
}
printf("%s
",phrase);
return 0;
}
sugiro que vc nao coloque os links das aulas anteriores de das proxima aulas bem onde fica a barra de time do youtube
Ola, eu tenho acompanhado as aulas e tenho aprendido muito aqui.
Mais estou com um problema, vou ate uzar o exemplo da aula, depois que eu uzo algum scanf no programa, ele ignora completamente o getchar ( to uzando o dev c++ e o code::blocks).
#include
main(){
char linha [100];
char caractere;
int i=0,a;
scanf("%i", &a); /* adicionei esse scanf aqui so para testar, e se eu escrever um numero, e der enter o programa termina e nao le do caractere=getchar() em diante (nem o printf la de baixo), mais se eu escrever um nome por exemplo ele captura a string normalmente e tipo que ignora o scanf*/
do{
caractere = getchar();
linha[i] = caractere;
++i;
} while (caractere != '
');
linha [i-1] = '\0';
printf("%s
",linha);
system("pause");
return 0;
}
assim fica tudo mais fácil !!!
#include
#include
int main(){
char palavra[50];
printf("DIGITE SEU NOME: ");
gets(palavra);
printf("
O NOME DIGITADO FOI >> %s
",palavra);
system("pause");
return 0;
}
Excelente!!!
to tentando fazer uma função pesquisa dentro de um arquivo.txt em um projeto mais to com dificuldade como faço ?
#include
#include
int main(void){
char linha[100];
char caractere;
int i=0;
do{
caractere=getchar();//Getchar funcao padrao da linguagem c
linha[i]=caractere;
++i; // ela vai na linha de comando e pega 1 caractere
}while(caractere!='
');
++i;
printf("%s
",linha);
system("pause");
return 0;
}
Pode ser assim também ?
uso o devec++, e no meu funcionou correto sem a linha que poe o caractere nulo, nao apareceu aquele lixo
Como retornar uma string de uma função para outra?
Eu utilizo outro método que acho bem mais fácil.
Ex:
main () {
char nome[50];
printf("Digite seu nome completo.
==>");
fflush(stdin); gets(nome); // Ou também poderia ser usado da seguinte maneira: fgets(nome, 50, stdin);
printf("Seu nome completo e: %s
", nome);
}
Usando uma biblioteca neh! kkkk
Seu nutela!
Tô usando um scanf após o getchar ele está ignorando totalmente o scanf.... como arrumar isso?
Nao entendi a necessidade de fazer as atribuições:
caractere = getchar( );
linha[i] = caractere;
nao podia ter sido feito simplesmente:
linha[i] = getchar(); ??
Obrigado!
Se ele não tivesse feito o esquema o ciclo não teria acabado, o buffer não adiciona o '
' ao vetor por último
Usei uma função parecida pra obter string mas preciso converter ela pra s1 e s2 pra usar como argumento para outra função. Sim, estou tentando juntar a matéria desse vídeo com a da aula 51. Pensei em usar algo assim para fazer isso
obterString();
strcpy (s1, linha);
obterString();
strcpy (s2, linha);
Sendo linha o return da função de obter string. Claro que esse pedaço de código não funciona, botei ali pra dar ideia do que preciso fazer. Alguma ideia?
Faltou so uma melhor/maior interação com usuário, como podemos melhorar isso?
Na verdade seria:
linha[i-1]=getchar();
dessa forma não da erro.
vc pode dizer que char linha[100] = '\0' que o problema tbm resolve
getchar é o mesmo que getche????
o Do faz o que ? significa o que ?
Amigo se eu quisesse imprimir uma palavra abaixo da outra apos cada espaço
ex : digitar : pao com mortadela
imprimir : pao
com
mortadela
como faço ?
Att;
+Jeferson Oliveira Usaria um ciclo e colocando um
no printf!
Faz um vídeo só comendo o pão com mortadela.
pq o programa recebe a string do usuario sem a função scanf???
Porque existem outras funções que tbm podem receber uma string do usuário, por exemplo: gets.
Alias essa função getchar não pega uma string digitada pelo usuário, mas sim um único caractere.
2021?
Eu achei desnecessário esse ciclo do while, desse jeito roda do mesmo jeito:
#include
#include
#include
int main(){
char nome[50];
setlocale(LC_ALL,"portuguese");
printf("Digite seu nome: ");
gets(nome);
printf("
Seu nome é: %s
",nome);
system("pause");
return 0;
}
Estava pensando nisso, é muito mais pratico usar o comando fgets, ou será que vale a pena aprender esse outro comando? O que você acha?
@@marleijava7659 Depende do que o professor pedir, mas na prática, não vai usar
O intuito da aula é ensinar sem usar atalhos, dps ele vai ensinar isso. Um passo de cada vez, meu nobre.