问题
Lets say I have the below C code:
int getLine (char line[])
{
int c, i=0;
while( (c=getchar()) != EOF )
line[i++]=c;
line[i++] = c;
return i;
}
>> Enter: 007
>> ^Z
>> Output:
If we closely observe the way I give output above, I am pressing Enter
before stimulating EOF. This means, the length of string is 4 not 3 (excluding EOF).
When I am doing my exercises, I am really facing some trouble with that extra \n.
How do I stimulate EOF without newline? Is it possible at all?
>> Enter: 007^Z
>> ^Z
>> Output: length=6
回答1:
Converting my comment into an answer:
On which platform? On Unix and derivatives, you would type the EOF 'character' twice — usually control-D rather than control-Z, though. That may also work on Windows; I don't know, but it is worth a try.
(A response comment affirms that the platform is Windows.)
On Unix, control-D makes the data on the line available to the program. The first control-D gives it what you've typed already; the second gives it zero bytes to read, which is the indication of EOF.
回答2:
Then avoid storing the newline, in the loop. It's not as if you're being forced to store all characters regardless of value. :)
Also, you're not terminating the string correctly. This:
line[i++] = c;
should be:
line[i] = '\0';
And of course, it's sensitive to buffer overflow.
In general, you'd be better of using fgets()
.
EDIT: I might be missing the point, but it seems to be that the entire focus on EOF
is ... misguided, if all you want to do is read a line. Lines are not generally terminated with EOF
, but with \n
. So the function should probably just store characters until either EOF
or \n
is encountered.
来源:https://stackoverflow.com/questions/14199485/how-to-stimulate-eof-without-preceding-newline-in-c