Jump to content

LLuciano

Members
  • Posts

    6
  • Joined

  • Last visited

  • Days Won

    1

LLuciano last won the day on September 7 2023

LLuciano had the most liked content!

Recent Profile Visitors

599 profile views

LLuciano's Achievements

5

Reputation

  1. Olha só que legal que descobri esses dias, uma forma de limpar o buffer com o scanf... É muito sagaz o uso de Regex no scanf (e família).. dá pra fazer muita coisa legal. long int get_l_int(char *mensage) { char c[64] = {0}; long int n = 0; printf("%s", mensage); scanf("%64s", c); scanf("%*[^\n]"); //limpa o buffer. n = strtol(c, NULL, 0); return n; }
  2. Nossa! Que aula! Valeu demais!! Agora ficou tão óbvio!KKKK Acho que entendi perfeitamente sua explicação! Nada melhor do que tentar desenvolver do 0 minhas coisas.. eu sempre fiquei tentando resolver alguns exercícios que achava, mas no exercício já vem no meio do capítulo de um livro e ai a gente já vai achando as respostas e etc.. Isso ficou demais! Um dia chego ai! Eu acho recursão o estado da arte na programação.. ainda não consegui desenvolver sozinho nenhuma função com recursão! Agora, colocar a recursão no meio de um ternário é pra emoldurar o código! Muito obrigado por responder! Forte Abraço! Luciano.
  3. Fala pessoal.. Estava estudando C aqui e resolvi fazer um programinha de soma, bem simples.. eu passo no terminal o números e ele me devolve a soma. Dava para fazer tudo na main.. mas decidi criar uma função para o caso de animar a fazer outras operações além da soma e também treinar o uso de ponteiros.. ai que veio o problema. O programa está assim: #include<stdio.h> #include<string.h> #include<stdlib.h> int sum(int n, char **args[]); int main(int argc, char *argv[]) { if (argc < 3) { puts("usage: calc n1 n2"); exit(1); } int result; result = sum(argc, &argv); printf("%d\n", result); return 0; } int sum(int n, char **args[]) { int result = 0; for (int i = 1; i < n; i++) result += strtol((*args)[i], NULL, 10); return result; } O problema está na linha 26: result += strtol((*args)[i], NULL, 10); // aqui é versão que funciona Primeiro eu fiz o strtol sem o enclausurar o *args nos parênteses.. da seguinte forma: result += strtol(*args[i], NULL, 10); // versão com falha na segmentação. O Compilador aceitou, usei o GCC default para compilar.. porém em execução deu Segmentation fault: Program received signal SIGSEGV, Segmentation fault. 0x0000555555555201 in sum (n=4, args=0x7fffffffdfe0) at err-sum.c:26 26 result += strtol(*args[i], NULL, 10); Eu lembrei que para declarar uma ponteiro para função é necessário os parênteses devido a regra de precedência: int (*nome)(parametro1, ..) //ponteiro para função int * nome(parametro1, ..) // função que retorna um ponteiro para um inteiro. Então, por puro chute, eu resolvi colocar os parênteses e tudo funcionou lindamente… o problema é que não entendi o motivo que eu preciso usar esse parênteses ai. Na minha cabeça ao fazer *args[i] eu já estaria “desreferenciando” o suficiente. Alguém consegue me explicar? Tentei buscar nos materiais que eu tenho mas não consegui encontrar a explicação. Dá uma agonia qdo o negócio funciona e eu não entendo o movito.. kkkk Valeu Luciano. Ps: O nome mais esquisito esse de desreferenciar...
  4. Olha só que legal essa função que achei no livro C Primer Plus, funcionou muito bem. O único "erro" que achei é quando o usuário digita um número válido seguido de espaço e outra coisa (se for outro número o loop conta como várias escolhas). long get_long(void) { long input; char ch; while (scanf("%ld", &input) != 1) { while ((ch = getchar()) != '\n') putchar(ch); // dispose of bad input printf(" is not an integer.\nPlease enter an "); printf("integer value, such as 25, -178, or 3: "); } return input; }
  5. Nossa! Valeu! Era só ter estudado o scanf decentemente! Tinha que ser mais simples que eu estava fazendo.
  6. Olá pessoal! Estou estudando C sozinho. Em vários exercícios tem a necessidade de criar uma espécie de menu com opções. Mas, considerando o que eu aprendi até agora, é muito fácil de dar um erro caso o usuário digite algo errado, como por exemplo uma letra quando eu esperava um inteiro. Isso me dá uma angustia, ficar fazendo exercício cujo o programa pode ser facilmente quebrado. Eu procurei uma função na biblioteca padrão para isso mas não encontrei, então tentei fazer eu mesmo uma solução. Eis as dúvidas: 1 - Existe alguma função que já implementa isso? 2 - O código que desenvolvi está funcionando... mas parece que estou com a mente viciada.Fico com a impressão de que poderia ser mais simples mas não consigo fazer melhor. Alguém tem alguma sugestão? (Fiz somente considerando opções numéricas, não alfabéticas, ou com palavras) Eis o código: #include <stdio.h> #include <ctype.h> int menuNumberCheck (void); int main(void){ int choice = 0; do { printf("%s", "Digite um número de 0 a 10 ou digite 11 para finalizar: "); choice = menuNumberCheck(); if (choice < 0 || choice > 11){ puts("Opção inválida"); } else printf("Você escolheu a opção %d\n", choice); } while (choice != 11); puts("Programa finalizado"); return 0; } int menuNumberCheck (void){ int check = 1; char c; int number = 0; int loopcount = 0; while ((c = getchar()) != '\n'){ if (isdigit(c) && check == 1){ //check multpiplication overflow: //se verdadeiro é que vai ocorrer overflow e retornar erro. //multiplica o dígito pode 10 para encontrar a posição (unidade, dezena e etc); if (__builtin_smul_overflow(number, 10, &number)) { puts("Overflow"); check = 0; //check sum overflow //soma o digito encontrado na unidade //se verdadeido é que vai ocorrer overflow e retornar erro. // c-48 para encontrar o número na tabela ANSCI-I } else if (__builtin_sadd_overflow(number, c-48, &number)) { puts("Overflow"); check = 0; } else loopcount++; } else check = 0;//falso se encontrar algum caracter não numérico. } if (check == 0 || loopcount == 0){ return -1; } else return number; }
×
×
  • Create New...