Jag har nu skrivit av programmet ur boken och tror att det funkar som författarna menar, det går igenom raderna i t.ex. en textfil (./program < textfil) och när den största raden påträffas så skrivs den längsta linjen ut hädanefter istället för de rader som verkligen kommer. Lite pointless men ska väl visa konceptet.
Men jag har problem att konceptuellt fatta hur vissa delar av programmet funkar. Har inte fått den där Aha upplevelsen ännu... Det känns som koden bryter mot hur jag förstår funktioner. T.ex. i den första while loopen i main() med funktionen getline2.
Som jag tolkar koden så ser det ut såhär:
- Man skickar följande argument: getline2(1000, 1000).
- Väl inne i funktionen används funktionen getchar() för att få extern data som t.ex. från en textfil
- Det loopar genom tills raden stöter på '\n' och räknar hur lång raden är samt lagrar varje karatär i array s[], avslutar alltid med '\0' vilket är rätt.
- Funktionen returnerar radens längd.
- Om radens längd > max så definiera radens längd som nya maxvärdet.
- kör copy funktionen som kopierar värdet line > longest
- skriv ut longest.
Som jag har förstått funktioner så array:n s[] som finns innuti getline2 kommer inte ur ur funktionen och är en temporär variabel som försvinner om den inte returernas? Men här verkar det som s[] slapp ut ur funktionen, blev definierad som line och kunde nyttjas av copy.
Jag har lite samma grunningar gällande copy funktionen. Jag förstår den kopierar from > på ett ganska elegant sätt med en while loop. Men förstår inte hur den informationen slipper ut ur copy då den är void. Men uppenbarligen gör den det. Det verkar inte som att en funktion uttryckligen måste returnera data. Det ser ut som att informationen returernas via parametrarna som används för att anropa funktionerna och det är så datan för line slipper ut ur getline2 samt ur funktionen copy. Eller har jag fattat det fel?
Ganska mycket svammel här hoppas det går att förstå. Men jag vill inte gå vidare innan jag fått den här Aha upplevelsen och koden plötsligt klickar för mig.
Kod: Markera allt
#include <stdio.h>
#define MAXLINE 1000
/* declare function prototypes */
int getline2(char line[], int maxline);
void copy(char to[], char from[]);
/* print longest input line */
int main()
{
int len; /* current line length */
int max; /* maximum length seen so far */
char line[MAXLINE]; /* current input line */
char longest[MAXLINE]; /* longest line saved here */
max = 0;
while ((len = getline2(line, MAXLINE)) > 0)
{
if (len > max) {
max = len;
copy(longest, line);
}
if (max > 0) // there was a line
{
printf("%s", longest);
}
}
return 0;
}
/* getline: read a line into s, return length */
int getline2(char s[], int limit)
{
int c, i;
for (i = 0; i < limit-1 && (c = getchar()) != EOF && c !='\n'; i++) {
s[i] = c;
}
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
/* copy: copy 'from' into 'to'; assume its big enough */
void copy(char to[], char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0') {
++i;
}
}