INF2270 L?sningsforslag til ukeoppgaver uke 5 2008 Oppgave 1 int is_opt (unsigned char s[]) { return s[0]=='-'; } (NB! Den fungerer ogs? om s er en tom tekst. Hvorfor?) Oppgave 2 #include int main (int argc, char *argv[]) { int i; for (i = 1; i < argc; ++i) { if (i > 1) printf(" "); printf("%s", argv[i]); } printf("\n"); return 0; } Oppgave 3 #include /* pga `isdigit'; se nedenfor */ int atoi (char s[]) { int fortegn = 1, ix = 0, res = 0; /* Hopp over innledende tegn som ikke h?rer til tallet: */ while (s[ix]!= 0 && s[ix]!='-' && !isdigit(s[ix])) ++ix; /* Ta var p? fortegnet (om tallet har fortegn): */ if (s[ix] == '-') { fortegn = -1; ++ix; } /* Les sifrene og beregn tallet: */ while (isdigit(s[ix])) { res = 10*res + s[ix]-'0'; ++ix; } /* Return?r: */ return fortegn*res; } Oppgave 4 #include #include extern char **environ; int main (int argc, char *argv[]) { if (argc == 1) { /* Skriv all omgivelsesvariablene: */ char **p = environ; while (*p) { printf("%s\n", *p); ++p; } return 0; } if (argc == 2) { /* Skriv bare en omgivelsesvariabel: */ char *vd = getenv(argv[1]); if (vd != NULL) printf("%s\n", vd); return 0; } printf("Usage: printenv [name]\n"); return 1; } Oppgave 5 #include #include int main (int argc, char *argv[]) { /* Listen: */ struct line { struct line *next; char data[201]; }; struct line *first_line = NULL, *last_line = NULL, *this_line, *p; /* Andre variable */ FILE *inn_f; char *fil_navn, cur_line[201]; int n_saved = 0, n_lines = 0; /* Sjekk paramtrene: */ if (argc == 2) { /* Ingen opsjoner, kun et filnavn: */ n_lines = 10; fil_navn = argv[1]; } else if (argc == 3) { /* B?de en opsjon og et filnavn: */ n_lines = - atoi(argv[1]); fil_navn = argv[2]; } else { printf("Usage: tail [-n] file\n"); return 1; } /* Innlesning */ inn_f = fopen(fil_navn,"r"); if (inn_f == NULL) { printf("tail: Cannot read `%s'\n", fil_navn); return 2; } while (1) { if (fgets(cur_line, 201, inn_f) == NULL) break; this_line = malloc(sizeof(struct line)); strcpy(this_line->data, cur_line); this_line->next = NULL; if (n_saved == 0) { first_line = this_line; last_line = this_line; ++n_saved; } else { if (n_saved == n_lines) { /* Fjern en linje: */ p = first_line->next; free(first_line); first_line = p; --n_saved; } last_line->next = this_line; last_line = this_line; ++n_saved; } } fclose(inn_f); /* Utskrift: */ this_line = first_line; while (this_line) { /* Skriv ut og fjern et element: */ p = this_line->next; printf("%s", this_line->data); free(this_line); this_line = p; --n_saved; } }