Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 296
  • Last Modified:

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;
   }
0
rmtogether
Asked:
rmtogether
  • 5
  • 3
  • 3
  • +1
3 Solutions
 
callrsCommented:
 for (i=0;
 -> start loop with i=0

i < lim-1 && (c=getchar())!=EOF && c!='\n';

-> continue while:
- i is less than lim-1 AND
- (get a byte, assign the byte to c)
- c is not end-of-file AND
- c is not end-of-line

 ++i)
-> Increment i by one with each iteration of the loop
0
 
callrsCommented:
http://www.sysprog.net/cloop.html    C loops

for (INITIALIZATION; CONDITION; ITERATION)
   {
   BODY
   }
0
 
callrsCommented:
\n means newline:
"The C programming language provides the escape sequences '\n' (newline) and '\r' (carriage return). " (http://en.wikipedia.org/wiki/CRLF)
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
rmtogetherAuthor Commented:
why use lim-1 ? why not just use lim?
0
 
callrsCommented:
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.

0
 
PaulCaswellCommented:
Hi rmtogether,

It's lim-1 because you are building a string so you need to leave room for the null terminator on the end.

       s[i] = '\0';

If it was i<lim then at the end of the loop i will be == lim so this line will write beyond the limit specified.

Paul
0
 
rmtogetherAuthor Commented:
hi,
in the for statement has c!='\n', but insie brace has c=='\n'. I am confused about this.?
0
 
PaulCaswellCommented:
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
0
 
callrsCommented:
!=      -> 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.]
0
 
sunnycoderCommented:
>in the for statement has c!='\n', but insie brace has c=='\n'. I am confused about this.?
The != check is the for loop and == check is outside the for loop ...

The for loop can temrinate on one of these conditions
a) EOF was read
b) Newline was read

In case newline (\n) was read then at the end of loop, array line will NOT contain \n, and c will contain \n.

The check AFTER for loop " if (c == '\n')" checks if this was the case ... If yes, then it adds newline to buffer. This is similar in behavior to fgets that reads in newline too.

However, there is a potential bug in the program ... It loops to lim, i.e. it has valid locations from 0 to lim-1 .. In the for loop it fills up all locations from 0 to lim -2 (loop says < l-1) and after loop it potentially adds two characters (\n and \0) while it has memory for only one.

This is a buffer overrun and can cause crash/corruption
0
 
sunnycoderCommented:
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
0
 
rmtogetherAuthor Commented:

What is the purpose of the getline function.
Is it used for return the length of each line of a input file?
0
 
sunnycoderCommented:
Yes, that is what the function is being used for ...

Purpose of getline
 /* getline:  read a line into s, return length  */
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 5
  • 3
  • 3
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now