Avatar billede morw Nybegynder
21. november 2003 - 15:59 Der er 5 kommentarer og
1 løsning

Parameter fra promt

Hej

Nogen der kan skrive dette om så, det virker med tal over 9:

#include <stdio.h>

int main(int argc, char *argv[])
{
  int i;

  int sum = 0;

  for(i = 1; i < argc; i++)
  {
    sum = sum + (int) *argv[i] - 48;
  }

  printf("\n"); 
  printf("%i", sum);
  printf("\n");

  exit(0);

}

Hvis man kalder det med ./prog 10 20 30 skal det udskrive 60
Avatar billede arne_v Ekspert
21. november 2003 - 16:19 #1
sum = sum + atoi(argv[i]);
Avatar billede morw Nybegynder
21. november 2003 - 16:34 #2
tak

Fandt dog en getint funktion via google.

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

int getint(int *n,const char *str)
{
  /*
  Returns 0 if success in conversion.
  Returns 1 if str not number.
  Returns 2 if conversion overflow or underflow
  */

  char *s;
  long ln = strtol(str,&s,10);
  if(*s != '\0') return 1;

  if(ln > (long)INT_MAX || ln < (long)INT_MIN) return 2;
  *n = (int)ln;
  return 0;
}

int main(int argc, char *argv[])
{
  int i, err, ny;
  int sum = 0;

  if(argc < 3)
  {
    puts("At least two numbers");
    exit(-1);
  }

  for(i = 1; i < argc; i++)
  {
    err = getint(&ny, argv[i]);

    if(!err)
    {
      sum = sum + ny;
    }
    else
    {
      if(err == 1)
      {
        printf("Failure of conversion of \"%s\" to int\n",argv[i]);
        exit(0);
      }

      if(err == 2)
      {
        printf("int overflow(underflow) in conversion of \"%s\"\n",argv[i]);
        exit(0);
      }
    }
  }

  printf("%i", sum);
  printf("\n");

  exit(0);
}
Avatar billede arne_v Ekspert
21. november 2003 - 16:40 #3
strtol kan også bruges ja.

Jeg lavede engang den her lille sammenligning:

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

void testi(char *s)
{
  int v;
  char *ep;
  v = atoi(s);
  printf("%s = %d\n",s,v);
  v = strtol(s, &ep, 10);
  if(ep > s)
  {
      printf("%s = %d\n",s,v);
  }
  else
  {
      printf("%s not number\n",s);
  }
}

void testfp(char *s)
{
  double v;
  char *ep;
  v = atof(s);
  printf("%s = %f\n",s,v);
  v = strtod(s, &ep);
  if(ep > s)
  {
      printf("%s = %f\n",s,v);
  }
  else
  {
      printf("%s not number\n",s);
  }
}

int main()
{
  testi("123");
  testi("abc");
  testfp("123.456");
  testfp("abc.def");
}
Avatar billede arne_v Ekspert
21. november 2003 - 16:42 #4
Den her logik:

if(ln > (long)INT_MAX || ln < (long)INT_MIN) return 2;
  *n = (int)ln;
 
giver iøvrigt kun mening på compilere hvor sizeof(int) < sizeof(long),
hvilket ikke er tilfældet på de fleste PC compilere idag.
Avatar billede morw Nybegynder
21. november 2003 - 17:02 #5
Jeg bruger gcc på Freebsd, intel platform

Men det er vel hvor at checke overflow - hvordan kan man ellers sikre sig mod overflow?
Avatar billede arne_v Ekspert
21. november 2003 - 19:58 #6
strtol returnerer LONG_MAX eller LONG_MIN i det tilfælde og errno sættes
til ERANGE.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester