1

我终于让这段代码在我的命令行上使用了一个参数,即一个可以使用的文件,尽管我设计代码的概念是它可以使用无限数量的文件。它的作用是获取一些包含由空格分隔的单词的文本文件,并用空格替换空格,\n从而创建一个单词列表。虽然,它成功完成了第一个参数,但它只是忽略了第二个。

另一个小问题似乎是它最后还打印了一些垃圾字母,一个上面有两个点的 Y;我假设一些 EOF 符号,但我似乎无法阻止这种情况发生!

int main(int argc, char** argv) {
    FILE *fpIn, *fpOut;
    int i, j;
    j = 1;
    char c;
    char myString[256];

    printf("%d", argc);
    printf("\n");
    printf("The following arguments were passed to main(): ");
                for(i=1; i<argc; i++) printf("%s ", argv[i]);
    printf("\n");

    while(argc--) {
        for(i = 1; i < argc; i++) {
            fpIn = fopen(argv[j], "rb");
            snprintf(myString, 256, "%s~[%d]", argv[j], i);
            fpOut= fopen(myString, "wb");
            while (c != EOF) {
                c = fgetc(fpIn);
                if (isspace(c)) 
                    c = '\n';
                fputc(c, fpOut );
            }
            j++;
        }
    }
    return 0;
}
4

1 回答 1

4

,和函数(或宏)返回一个getchar(),而不是一个。getc()fgetc()intchar

您必须使用:

int c;

while ((c = fgetc(fpIn)) != EOF)
{
    if (isspace(c))
        c = '\n';
    fputc(c, fpOut);
}

想想看;函数必须能够返回任何有效char EOF(这与任何有效值不同char。因此,根据定义,返回值不能是char...

如果你使用会发生什么char

  • 您的原始代码在测试之前没有初始化c(因此循环可能会提前中断)。
  • 您的代码在读取 EOF 后没有c立即进行测试(因此它可能会打印一个垃圾字符,通常是 ÿ,带有分音符号的拉丁小写字母 Y,U+00FF)。
  • 如果你的char类型是无符号的,你永远不会看到 EOF。
  • 如果您的char类型已签名,一些有效字符(通常又是ÿ))将被误解为 EOF。

不过,我似乎仍然无法让它适用于多个参数。

问题在于您正在运行的双循环:

int i, j;
j = 1;

while (argc--)
{
    for (i = 1; i < argc; i++)
    {
        fpIn = fopen(argv[j], "rb");
        ...process fpIn...
        j++;
    }
}

让我们假设您使用两个文件名调用命令;然后argc == 3

第一次经过while循环后,argc == 2. 然后,您使用值 1进行for循环;i你打开argv[1](因为j == 1)。您处理该文件;然后递增j到 2,在递增之前,也递增i到 2。第二次围绕for循环,i== 2 一样argc,所以for循环终止。while 循环argc再次递减到 1,但测试2 != 0. 但是,for循环设置i = 1然后终止,因为i == argc. while循环递减到 1,然后argc重复。

您可以使用while循环或for循环,但不需要两者。

所以,要么:

for (i = i; i < argc; i++)
{
    ...process argv[i]...
}

或者:

while (--argc > 0)
{
    ...process *++argv...
}

我会使用for循环。

于 2011-12-28T00:03:18.790 回答