förmodligen en simpel C fråga
Postat: 8 januari 2023, 10:50:51
Jag håller på och läser igenom C boken "C Programming Language: 2nd Edition" och är på kapitlet om arrayer så länge. Det första jag stötte på här var att i originalkoden i boken så skulle man skriva en funktion som heter getline, men det resulterade i fel. Det visade sig att funktionen getline har lagts till i C språket sedan boken skrevs. Så jag gjorde den att heta getline2 helt enkelt för att komma vidare. Intressant vilka saker man stöter på med en gamal bok, lärde mig nåt extra på det viset tycker jag.
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:
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.
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;
}
}