The getchar()
, getc()
and fgetc()
functions (or macros) return an int
, not a char
.
You must use:
int c;
while ((c = fgetc(fpIn)) != EOF)
{
if (isspace(c))
c = '
';
fputc(c, fpOut);
}
Think about it; the functions must be able to return any valid char
and EOF (which is distinct from any valid char
value. So, by definition, the return value can't be a char
...
What happens if you use char
?
- Your original code didn't initialize
c
before testing it (so the loop might break early).
- Your code didn't test
c
immediately after reading EOF (so it might print a garbage character, often ?, LATIN SMALL LETTER Y WITH DIAERESIS, U+00FF).
- If your
char
type is unsigned, you'd never see EOF.
- If your
char
type is signed, some valid characters (often ? again)) will be misinterpreted as EOF.
I still can't seem to get it working for multiple arguments though.
The problem there is the double loop you have running:
int i, j;
j = 1;
while (argc--)
{
for (i = 1; i < argc; i++)
{
fpIn = fopen(argv[j], "rb");
...process fpIn...
j++;
}
}
Let us suppose you invoke the command with two file names; then argc == 3
.
After the first time past the while
loop, argc == 2
. You then do a for
loop with i
taking the value 1; you open argv[1]
(because j == 1
). You process that file; then increment j
to 2, before also incrementing i
, also to 2. The second time around the for
loop, i
== 2 as does argc
, so the for
loop terminates. The while loop decrements argc
again to 1, but tests that 2 != 0
. However, the for
loop sets i = 1
and then terminates because i == argc
. The while
loop decrements argc
to 1, and repeats.
You can use a while
loop or a for
loop, but you don't need both.
So, either:
for (i = i; i < argc; i++)
{
...process argv[i]...
}
Or:
while (--argc > 0)
{
...process *++argv...
}
I'd use the for
loop.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…