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
Annonceindlæg fra FPT Software
21. november 2003 - 16:19
#1
sum = sum + atoi(argv[i]);
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); }
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"); }
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.
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?
21. november 2003 - 19:58
#6
strtol returnerer LONG_MAX eller LONG_MIN i det tilfælde og errno sættes til ERANGE.
Kurser inden for grundlæggende programmering