Obligatorisk oppgave nr 2 i INF2270 v?ren 2008
Frist
Fristen er satt til: onsdag 7. mai 2008 kl 23.59. Gruppel?reren bestemmer hvorledes oppgaven skal leveres.Funksjonen `sprintf?
Standardfunksjonen sprintf i C fungerer som printf men resultatet havner i en tekstvariabel i stedet for ? bli skrevet ut. For eksempel vilresultere i at `str? inneholder ?Her er 4 siffer.? (samt en 0-byte som avslutning). Les mer i man sprintf om hvorledes sprintf fungerer; ikke glem at sprintf ogs? returnerer en verdi.char str[200]; int x; x = 4; sprintf(str, "Her er %d %s.", x, "siffer");
Oppgaven er ? skrive funksjonen sprinter som er en forenklet utgave av sprintf. N?rmere bestemt kan vi anta f?lgende forenklinger:
- De eneste %-spesifikasjonene som kan forekomme, er %c, %d, %s, %x og %%.
- Alle %-spesifikasjonene unntatt %% kan inneholder en ?n-sifret breddeangivelse 1–9 som for eksempel %4c, %8d, %1s eller %9x. Denne breddespesifikasjonen angir et minimum for hvor mange posisjoner %-spesifikasjonen skal resultere i.
- Det er ingen andre modifikasjon av %-spesifikasjonene (som +, -, 0 eller l (for ?long?)).
- Signaturen er
int sprinter(char *res, char *format, ...);
- Hvis formatet inneholder ulovlige spesifikasjoner som %a eller %22x, kan du selv velge hva resultatet skal v?re, men funksjonen skal ikke gi kj?refeil.
Oppgaven
Oppgaven er ? skrive funksjonen sprinter i x86-assemblerspr?k. Den skal l?ses individuelt, s? vi forventer at alle innleverte l?sninger er forskjellige. Det er heller ikke lov ? bruke en kompilator til ? generere koden. Ytterligere regler finnes i http://www.ifi.uio.no/studinf/skjemaer/erklaring.pdf som forutsettes lest av alle som skal levere obligatoriske oppgaver i INF2270.Legg vekt p? oversiktlig programmering og gode kommentarer! Gruppel?reren kan nekte ? rette besvarelsen hvis det er for vanskelig ? forst? hvorledes funksjonen virker.
Det er lov ? la sprinter kalle andre funksjoner, men da skal de ogs? skrives i x86-assemblerspr?k og legges ved.
Det finnes et testprogram som gruppel?rerne vil bruke under rettingen; det kan v?re lurt ? pr?ve det selv.
Er du i tvil om noe i oppgaven, s? sp?r gruppel?reren eller meg.
Hint
- Skriv aller f?rst noen C-programmer som bruker den originale sprintf slik at du blir sikker p? hvorledes sprintf virker.
- F?r du begynner ? skrive assemblerkode, b?r du l?se problemet i et h?yniv?spr?k du kjenner godt (for eksempel C) slik at du vet n?yaktig hva som skal gj?res.
- De f?rreste klarer ? skrive en slik funksjon i ett uten testing. Start heller med en implementasjon av strcpy og utvid den til ? h?ndtere %%, s? %c, %s og %x og til sist %d (som er vanskeligst).
- Helt til sist kan du legge inn h?ndteringen av breddeangivelsen.
En god id? (men intet krav) er ? legge resultatet produsert i
forrige punkt i en egen buffer og s? skrive kode som finner ut
hvor mange blanke som m? settes inn f?r bufferen overf?res.
Vi antar at ingen tekster som skal skrives ut (med %s) er lengre enn 1023 tegn.
- Let etter ideer i ukeoppgavene som har v?rt gitt og fasit til disse.
Lykke til!
20. februar 2008
Dag Langmyhr