rmtogether
asked on
for statement question
Hi,
could someone explain the following code for me (I don't get the line with ? mark) thank you very much!
#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */
int getline(char line[], int maxline);
void copy(char to[], char from[]);
/* print the longest input line */
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 = getline(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 getline(char s[],int lim)
{
int c, i;
for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i) -------------------------- ---------- --------?
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
could someone explain the following code for me (I don't get the line with ? mark) thank you very much!
#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */
int getline(char line[], int maxline);
void copy(char to[], char from[]);
/* print the longest input line */
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 = getline(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 getline(char s[],int lim)
{
int c, i;
for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i) --------------------------
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
\n means newline:
"The C programming language provides the escape sequences '\n' (newline) and '\r' (carriage return). " (http://en.wikipedia.org/wiki/CRLF)
"The C programming language provides the escape sequences '\n' (newline) and '\r' (carriage return). " (http://en.wikipedia.org/wiki/CRLF)
ASKER
why use lim-1 ? why not just use lim?
Arrays of course start at 0 index, not 1, so s[0] would hold the first byte etc., but that doesn't seem to be a factor in this case
lim shoud work too. You can try it & test it with MAXLINE set to a lower number like 50
I think it uses lim-1 to save a step: Since you don't need to read in the newline character, just skip it.
lim shoud work too. You can try it & test it with MAXLINE set to a lower number like 50
I think it uses lim-1 to save a step: Since you don't need to read in the newline character, just skip it.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
hi,
in the for statement has c!='\n', but insie brace has c=='\n'. I am confused about this.?
in the for statement has c!='\n', but insie brace has c=='\n'. I am confused about this.?
The loop walks through the line and stops either when the character it is looking at is a return or it hits the end of the file.
The check for c=='n' is just making sure it doesnt add the character if end of file is reached.
Paul
The check for c=='n' is just making sure it doesnt add the character if end of file is reached.
Paul
!= -> not equals
so: continue loop if c is not equal to '\n'
== -> equals
so: run the 'if' block only if the current byte is a '\n'
So, it seems that the if block will never get executed, and so the if block is superfluous...
Change of code: If you want to include the newline character in s, then remove the c!='\n' condition; else remove the if block.
I'll leave it for Paul to verify or correct my hunch. [Thanks Paul about the '\0'. I forgot to read beyond the loop.]
so: continue loop if c is not equal to '\n'
== -> equals
so: run the 'if' block only if the current byte is a '\n'
So, it seems that the if block will never get executed, and so the if block is superfluous...
Change of code: If you want to include the newline character in s, then remove the c!='\n' condition; else remove the if block.
I'll leave it for Paul to verify or correct my hunch. [Thanks Paul about the '\0'. I forgot to read beyond the loop.]
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
The for loop can temrinate on one of these conditions
a) EOF was read
b) Newline was read
or lim-2 characters were read ... Very important but not significant for demonstrating why the if statement is there
a) EOF was read
b) Newline was read
or lim-2 characters were read ... Very important but not significant for demonstrating why the if statement is there
ASKER
What is the purpose of the getline function.
Is it used for return the length of each line of a input file?
Yes, that is what the function is being used for ...
Purpose of getline
/* getline: read a line into s, return length */
Purpose of getline
/* getline: read a line into s, return length */
for (INITIALIZATION; CONDITION; ITERATION)
{
BODY
}