Ir ao conteúdo
  • Cadastre-se

codigo rapido

Membro Pleno
  • Posts

    275
  • Cadastrado em

  • Última visita

Tudo que codigo rapido postou

  1. Verdade. Obrigado! Não vi isso. Esquci. Acho que é porque eu to muito mal acostumado com o Java. :D Eu percebi que você fez um array. A entrada do parametro da função é char* str. No java podem ter parametros de entrada para funções como char[] str. As vezes isso me faz me perder um pouco porque se eu tentar fazer em algo que foi declarado como char *str não consigo fazer algo como str[n]='c Mas vendo seu codigo percebo que parece que é melhor utilizar arrays. quando eu devo dar preferência por usar char *str no lugar de char str[n]?
  2. consegui fazer, mas achei feio. Uma voltona e tive que fazer um malloc do mesmo jeito... Acho que não compensa fazer isso: #include <stdio.h> #include <stdlib.h> #include <string.h> char *inverte(char *str) { int tm = strlen(str); char strArr[tm]; // tem que copiar o char* para um array strcpy(strArr, str); // agora dá pra fazer swap char temp; for(int i=0; i<tm/2; i++) { temp = strArr[i]; strArr[i] = strArr[tm-i-1]; strArr[tm-i-1] = temp; } char *new = malloc(sizeof(strArr)+1); strcpy(new, strArr); return new; } int main(void) { char *nome = "abcdefghijklm"; nome = inverte(nome); printf("%s\n", nome); return 0; }
  3. eu fiz de um jeito a função que inverte uma string: #include <stdio.h> #include <stdlib.h> #include <string.h> char *inverte(char *str) { int tm = strlen(str); char* new = malloc( sizeof(char) * tm ); for(int i=0; i<tm; i++) { new[i] = str[tm-i-1]; } return new; } int main(void) { char *nome = "abcdefghijklm"; nome = inverte(nome); printf("%s\n", nome); return 0; } Agora é contigo pra saber como usar a função... Eu tentei fazer um swap nos caracteres da string, mas não consegui. porque isso aqui abaixo não funciona e como é o equivalente disso em c? str[0] = str[tm-1] Pelo que li, deveria existir uma função strrev(), mas aqui não funciona. talvez pra quem usa Windows, ela funcione...
  4. Não contribui em nada essa discussão. isso é ensinado no primeiro ano das faculdades em Algoritmos e Programação I. O ano foi 2004 Floriapólis, UNISUL campos pedra branca. E isso era ensinado assim justamente para os novatos. Agora se não usam mais essa definição, eu lamento.
  5. Quem tá aprendendo computação, no primeiro ano da faculdade, já é ensinado que metodo não retorna valor e que função retorna valor. Isso é ensinado e dado como senso independente de linguagem. Se no c tem sua particularidade, isso são outros 500. sim. correto. o que mostra que foi salvo por um programa que permite a escolha do encoding.
  6. Eu acho que é porque essas classes precisam estar no mesmo name espace. tentou adicionar "using namespace"? não se desculpe por isso. Aprender sozinho é ruim. Só ruminideos nascem sabendo andar.
  7. Sim e nem vai estar porque é arquivo txt. Cada um em sua lingua escreve da melhor forma que lhe agrada. Ou seja... Lá o alfabeto cirilico não é suportado pela iso-8859-1, que é opção de quem? de tem esse encoding? Não é? você só precisava corrigir uma coisa que escrevi errado: A palavra que usei não deveria ser 'formado' e sim 'encoding'. Mas eu não coloquei isso no titulo. Valeu pelo locale! me fez perceber que eu só tenho aqui na minha maquina utf-8 instalado, o que pra mim é estranho já que o meu gedit está salvando em 3 encodings diferentes incluindo o Latin1. O que me deu a ideia de criar um encode e decode pra garantir que eu só preciso instalar o meu programa no cliente e mais nada.
  8. Até no tempo em que eu usava Windows eu tinha essas opções de formato de salvamento. Quem ler o titulo vai entender. Ou seja, já sabe que existe diferenças de como os bytes dos caracteres são salvos dependendo da opção que escolher salvar o texto. Salvar é genérico. Mas como salvar é opcional. Tá ai a foto pra provar que existe sim: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <locale.h> int main() { char a; int i; a = 'Á'; printf("Á = %i\n", (int)a); a = 'A'; printf("A = %i\n\n", (int)a); i = -127; printf("-127 = %c\n", (char)i); printf("-63 = %c\n", (char)-63); printf("hexadecimal C1 ou decimal %i devia ser = Á, mas é %c\n", 16*12+1, (char)(16*12+1)); i = 65; printf("65 = %c\n\n", (char)i); return 0; } na minha tela: Agora isso sim é relevante. Não funcionou, mas é util. Assim como o comando locale -a Eu já decidi que vou fazer meu proprio encode e decode pra resolver o problema que to tendo. Não posso contar que o cliente ja tenha isso ou não isso na maquina dele.
  9. Olá pessoal! O problema parece simples, mas não sei resolver... tenho o seguinte programa que tenta abrir o aquivo file.txt, mas o arquivo foi salvo no formato iso-8859-1: #include <stdio.h> #include <stdlib.h> int main () { FILE *fp; int c; fp = fopen("file.txt","r"); while(1) { c = fgetc(fp); if( feof(fp) ) { break ; } printf("%c", c); } fclose(fp); return(0); } Então o que acontece é que ele mostra o conteudo do arquivo, mas não aparecem os caracteres que quero. Aparece '?'... (Feio)... Não é o que esperava. Eis aqui o conteudo do arquivo. Só uma linha: ágata @ 2012 Como devo fazer para que os caracteres aparecam como o conteudo do arquivo?
  10. Não sei. Eu acho arriscado colocar um ci sem ter o esquema. No primeiro momento quando vi a foto até pensei que fosse um oamp, mas não dá pra chutar. já pensou em ir num ferro velho procurando uma maquina igual? pode ser que dê sorte.
  11. Talyson, eu vou te passar um exemplo pra você testar ai e ver o que acontece. O equivalente pode ser feito com qualquer outro metodo ou função que esjeta aprendendo a usar. É sempre bom fazer isso antes de querer colocar nos seus codigos, pra ter certeza de que sabe o que tá acontecendo. A dica que dou é que tudo o que se abre, deve ser fechado, tudo o que é ligado, deve ser desligado, toda flag levantada, deve ser abaixada, se alocar espaço na memoria, deve livrar esse espaço novamente e assim vai. Quero dizer que tudo o que faz, deve ser desfeito, para manter o estado da sua maquina sempre constante, como se nem tivesse executado nenhum programa. isso é importante porque, por exemplo, as vezes você faz algo que pode impactar outros programas. A gente só deixa coisas ligadas quando sabemos muito bem que estamos fazendo isso. Isso vai depender do contexto em que tiver trabalhando. Algo que se aprende com o tempo. Eu vou indo porque apareceram outros problemas pra resolver. Espero que tenha ajudado. Desejo sucesso à você. #include <stdio.h> #include <stdlib.h> int main() { // system("exit") não existe em c. A verdade, o que isso faz é mandar // o comando para shell command para fehcar o console. // Não use system("exit") pra fechar o console. // Exemplos de como usar chamadas de shell command estão por ultimo logo abaixo. // Leia esses posts que pode ajudar // https://docs.microsoft.com/pt-br/cpp/cpp/program-termination?view=msvc-160 // https://stackoverflow.com/questions/8807448/cant-add-systemexit-in-c // descomente os 3 coments abaixo um de cada vez pra ver o que acontece printf("linha 1: vai funcionar!\n"); //return 0; printf("linha 2: vai funcionar!\n"); //exit(1); printf("linha 3: verificar se vai funcionar!\n"); // system("exit"); system("ls"); // pra quem usa linux system("dir"); // pra quem usa dos (Windows) printf("linha 4: verificar se vai funcionar!\n"); return 0; }
  12. porque o menu tá dentro do seu loop do-while dentro do main e não está dentro dos metodos cadastro e remover. moço, você colocou system exit de novo dentro do seu switch-case? porque você acha que tem que colocar isso ai? você sabe como funciona isso? sabe que se colocar isso ai, o seu programa sai sem ler o free(v)? dentro do case s, você pode deixar apenas um break que vai funcionar... ja pensou que pode colocar o menu em um metodo e chamar ele quando quiser?
  13. eu uso uma esfera (valvula de dosagem) de tampa dosadora de garrafa de bebida. Uma bolinha de gude bem cristalina que quando colocada perto da lente do celular, faz uma ampliação gigantesca. É usado nas escolas Mas percebi que aqui o maior problema é que a impressão está muito desgastada ou completamente apagadas e não existem cores como no resistores para identifica-los. com essas lentes você pode fazer um foldscope: https://www.foldscope.com/ https://www.youtube.com/results?search_query=foldscope+lens
  14. Nossa, moço! É bom saber disso, porque ai eu não compro dessa marca. Pior é que vi o preço dessa placa por curiosidade... é por volta de 900 reais. Era melhor fazer outra placa do meu proprio jeito só pra não pagar por uma nova. Vendo esse post eu fiquei com uma ideia de iniciarmos uma campanha pra fotografar toda placa que pudermos e deixar disponivel em algum forum pra quando esses problemas acontecerem pelo menos o autodidata ter alguma referencia. Desejo boa sorte na sua busca. Espero que descubra qual é o ci.
  15. você quis dizer: vai salvar só um aluno. Sim. É isso mesmo. Sucesso pra você
  16. Olá pessoal! Obrigado pela atenção de todos! Consegui pegar as variaveis. Era mais fácil que pensei... eu não sabia que tinha que ser depois de um \r\n. Olha a parte do codigo que permitiu isso: childfd = accept(parentfd, (struct sockaddr *) &clientaddr, &clientlen); if (childfd < 0) { error("ERROR on accept"); } /* determine who sent the message */ hostp = gethostbyaddr((const char *)&clientaddr.sin_addr.s_addr, sizeof(clientaddr.sin_addr.s_addr), AF_INET); if (hostp == NULL) { error("ERROR on gethostbyaddr"); } hostaddrp = inet_ntoa(clientaddr.sin_addr); if (hostaddrp == NULL) { error("ERROR on inet_ntoa\n"); } /* open the child socket descriptor as a stream */ if ((stream = fdopen(childfd, "r+")) == NULL) { error("ERROR on fdopen"); } /* get the HTTP request line */ fgets(buf, BUFSIZE, stream); sscanf(buf, "%s %s %s\n", method, uri, version); printf("======================================\n"); printf("%s", buf); /* tiny only supports the GET method */ if (strcasecmp(method, "POST")==0) { char var_nome[BUFSIZE]; char var_str[BUFSIZE]; int linha = 1; int tamanho = -1; while( strcmp(buf, "\r\n") ) { printf("linha: %i = ", linha); fgets(buf, BUFSIZE, stream); printf("%s", buf); sscanf(buf, "%s %s\n", var_nome, var_str); //printf("Nome var: %s conteudo: %s\n", var_nome, var_str); if(strcmp(var_nome,"Content-Length:")==0) { tamanho = atoi(var_str); //printf("tamanho: %i \n", tamanho); } if(strcmp(buf, "\r\n")==0) { // tem que pegar o tamanho da query_string (Content-Length) acrescido de 1 // no caso, aqui pra mim usando firefox o resultado veio, na 14 linha, depois de \r\n\: fgets(buf, tamanho+1, stream); printf("%s\n", buf); printf(" - - leu - - -\n"); break; } linha++; } continue; Foi chatinho... valeu a diversão. t+ pra todos
  17. Olha só: #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char nome[20]; int matricula; } play; play cadastra_play() { int num_oper = 0; play a; // do { Se colocar esse loop aqui, ele renova play a antes dele ser inserino no array printf("Digite o seu nome: \n"); scanf(" %[^\n]s", a.nome); printf("Digite sua matricula: \n"); scanf("%d", &a.matricula); //printf("Deseja cadastrar mais aluno? (1 - para sim e 2- para não )\n"); //scanf("%d", & num_oper); system("cls"); //} while (num_oper == 1); printf("\n"); return a; } play * insere_play(play *v, int *n, play novo) { v = (play*) realloc(v, (*n + 1) * sizeof(play)); if (v == 0) { printf("Ops! não estamos conseguindo inserir o aluno"); } v[*n] = novo; (*n)++; return v; } play *remove_play(play *v, int *n, int matricula) { for (int i = 0; i < *n; i++) { if (v[i].matricula == matricula) { for(int j = i; j < *n - 1; j++) { v[j] = v[j+1]; } v = (play*) realloc(v, (*n - 1) * sizeof(play)); if (v == 0) { printf("Ops! não foi possivel remover alunos"); return 0; } (*n)--; break; } } return v; } //______________________________________ void lista_play(play *v, int *n) { printf("\nSegue a lista de alunos cadastrados por ordem de cadastro: "); for (int i=0; i<*n; i++) { printf("\n%s\n%d\n", v[i].nome, v[i].matricula); } } //_____________________________________________ int main() { int i, n = 0; play *v = 0; int mat = 0; printf("===MENU=== \n"); //system("cls"); char oper = 0; while (oper != 'S') { printf("Escolha:\nI... Cadastrar Aluno\nR... Remove Aluno\nL... Listar alunos \n"); scanf(" %c", & oper); system("cls"); switch (oper) { case 'I': ; play novo = cadastra_play(); v = insere_play(v, &n, novo); break; case 'R': scanf("%d", &mat); v = remove_play(v, &n, mat); break; case 'L': lista_play(v, &n); break; case 'S': break; default: printf("opcao invalida"); break; } } free(v); return 0; } você colocou um do while dentro do metodo de inserção. Só que esqueceu que quando de faz um "play a", antes desse loop, não adicionou ainda no array. Isso faz é alterar os valores que já escreveu em a. Para fazer o que quer, ir adicionando na sequencia, é necessário incluir dentro de cadastra_play o metodo insere_play... ou seja, vai precisar passar parametro para cadastra_play, para que a função insere_play dentro do metodo consiga ver essas variaveis. acha que consegue fazer? Se não conseguir, avisa que que mostro. OBS: eu tirei o monte de variaveis apenas pra agilizar aqui, mas você pode corrigir ai do seu modo e gosto.
  18. eu testei aqui o mesmo codigo que te passei. Pra mim mostrou os 2 que cadastrei. você mudou algo e não percebeu... Não se sinta. no começo é assim mesmo. já pegou cada função dessas que está utilizando no seu programa e testou, sozinho em programas menores? a gente começa com o printf, depois vai pro scanf... depois ponteiros, malloc, realoc e etc... A gente só começa programando algo assim quando a gente já tá crack em todos os metodos que pretende utilizar. A ideoa é dividir pra conquistar.
  19. Opa! Desculpa, não percebi que estava ambiguo. olha, eu devia ser capaz de fazer os dois. Mas o cabeçalho parece que vem sem problemas. Pra não ter mais ambiguidades, eu vou exemplificar... existe um intex.html onde está executando o meu programa em c assim: <form action="index.html" method="post"> <p> Name: <input type="text" name="username" value="João" /> </p> <p> Email: <input type="text" name="email" value="[email protected]" /> </p> <p> <input type="submit" value="Submit me!" /> </p> </form> veja que "method=post" é desse metodo que estou falando. Se for get, eu consigo pegar as variaveis. Mas quando é esse post, não sei como pegar... Eu uso linux. Penso que posso estar esquecendo de deixar alguma variavel visivel para o pequeno servidor que to criando. Não sei. Por isso preciso da ajuda de alguém com mais experiencia que eu em sockets e que já tenha feito algo parecido. Aqui no programa uso endereço ip e porta no navegador assim http://127.0.0.1:8080/ A ideia é não mandar as variaveis pela barra de endereços (get) e sim de forma invisivel ao usuário (post).
  20. Talyson! calma ai... eu te respondo. quando você ver um return dentro da função, é porque ela retorna um valor. por isso ela é chamada função.... como na matematica. existe função f(x) que é funcao porque retorna valor. A diretenca de metodo pra função é apenas isso. Ambas fazem alguma coisa. Elas trabalham, imprimem, calculam... todas são metodos por isso. Mas o que diferencia o metodo de funçao é que função retorna um valor. esse valor é retornado quando você ve um return dentro do metodo. E esse foi um dos motivo de não ver a lista: v não tava recebendo valor novo; você colocado um exit antes de ler o print da sua lista. fora isso, tá tudo bonitinho, ainda mais pra quem tá começando.
  21. Assim ficou mais elegante. Mas no caso de listar, não retorna valor... ela só imprime. A lista, é só um metodo. Ela não e funcao. Então não pode ser v=lista... tem que ser apenas lista_play()
  22. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> typedef struct { char nome[20]; int matricula; int idade; float peso; float altura; char posicao[100]; int operacao; }play; play cadastra_play() { play a; printf("Digite o seu nome: \n"); scanf(" %[^\n]", &a.nome); printf("Digite sua matricula: \n"); scanf("%d", &a.matricula); printf("Digite sua idade: \n"); scanf("%d", &a.idade); printf("Digite seu peso: \n"); scanf("%f", &a.peso); printf("Digite sua altura: \n"); scanf("%f", &a.altura); printf("Digite a posicao que voce pretende jogar: "); scanf("%s", &a.posicao); printf("\n"); printf("Obrigado pelo cadastro\n"); //sleep(2); return a; } play * insere_play(play * v, int * n, play novo) { v = (play * ) realloc(v, ( * n + 1) * sizeof(play)); if (v == 0) { printf("Ops! não estamos conseguindo inserir o aluno"); } v[ * n] = novo; ( * n) ++; return v; } play * remove_play(play * v, int * n, int matricula) { for (int i= 0; i<*n; i++) { if (v[i].matricula == matricula) { v[i] = v[ * n - 1]; v = (play * ) realloc(v, ( * n - 1) * sizeof(play)); if (v == 0) { printf("Ops! não foi possivel remover alunos"); return 0; } ( * n) --; break; } } return v; } int main() { int num_oper = 0, n = 0; play * v; int mat; char oper = 0; while (oper != 'S') { system("cls"); printf("===MENU=== \n"); printf("Escolha: I... Cadastrar Aluno\nR: Remove Aluno\nS: Sair do programa \n"); scanf(" %c", & oper); switch (oper) { case 'I': ; play novo = cadastra_play(); v = insere_play(v, &n, novo); break; case 'R': scanf("%d\n", & mat); v = remove_play(v, & n, mat); break; case 'L': //inserir para listar case 'S': oper='S'; break; default: printf("opcao invalida"); } } for (int i=0; i<n; i++) { printf("%s\n%d\n%d\n%.1f\n%.2f%s\n", v[i].nome, v[i].matricula, v[i].idade, v[i].peso, v[i].altura, v[i].posicao); } free(v); return 0; } O meu ficou assim e funcionou. Olhando bem, acho que você nem precisa desse case 'S' porque oper, dentro do while também, já vai ser S. Bastava apenas por um break dentro do case S.
  23. eu editei e acho que você não viu isso: tenta colocar v = insere_play. Quando eu faço funções (retornam valor, diferente de método que é void), eu as uso.
  24. Eu acho que é porque você colocou um exit(1) pra sair. Ai nesse caso, ele termina o programa de uma vez, sem passar pelo laço for. acho que você podia colocar ope='s' pra sair do while e ler o laço final Além disso, acho que sua função insere retorna valor... não devia ser algo mais ou menos assim: v = insere()

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!