-
K&R problem page
I've entered the program that is on page 29 of the K&R book. I use the Dev-cpp IDE on a Windows machine. The code compiles fine but I had to change a line in the code to get to program to work.
The code is below and i changed the text in bold from 0 to 1... which seems logical to me but why does the example in the book don't work? Has it something to do with the environment? Help appreciated...
Code:
#include <stdio.h>
#define MAXLINE 1000
int getline(char line[], int maxline);
void copy(char to[], char from[]);
int main(void)
{
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)) > 1) {
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;
}
/* 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;
}
-
That's a bug, you need to use the comparison operator == instead of the assignment operator. But it's not related to your problem, which is user error. On Windows you can signal EOF by typing ctrl+z, then the program will work correctly with 0. By the way, it's safer to copy from the book verbatim until you know enough to make changes to it. If youo're confident that you made an exact copy you can more easily tell if it's a problem with the book, or a problem with how you're using the code.
-
> if (c = '\n')
Should be
if (c == '\n')
-
Ok, thanks guys...
1/ I retyped the code... (so I get a better feel for it) I'm new to c... and clearly made an error using the assignment operator...
2/ Didn't know about the EOF signaling :eek:
-
Remember ctrl-z sends EOF (EndOfFile) in windows, and ctrl-d in Linux. I looked up the code on page 29 of my 1978 edition of K&R, you did quite a few modifications to make this thing work.