c - 如何更改取自 C 行参数的字符串的一部分?

标签 c command-line-arguments

我正在尝试编写一个简单的备份程序。它将接收一个文件,然后创建一个具有相同内容的文件,除非指定,否则扩展名为 .bak。下面是我的代码,当我指定我想要新文件的 .back 扩展名时,我的程序运行良好。我在尝试读取命令行中的路径时遇到问题,截断文件扩展名,将 .back 连接到它。有人可以指出我的代码中的问题吗?谢谢

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
    char ch, buffer[256];
    FILE *source, *target;

    if (argc < 2)
    {
        printf("Source file must be specified.");   
    }
    else if (argc == 3)
    {
        source = fopen(argv[1], "rb");
        target = fopen(argv[2], "wb");

        while ((ch = fgetc(source)) != EOF)
        {
            fputc(ch, target);
        }
    }

// the part below doesn't work
    else if (argc == 1)
    {
        int length = 0;
        source = fopen(argv[1], "rb");
        strcpy_s(buffer, 256, argv[1]);
        length = strlen(argv[1]) - 1;
        while (length > 0)
        {
            if (buffer[length] == ".")
                break;
            length--;
        }
        buffer[length + 1] = '\0';
        strcat(buffer, "bak");
        target = fopen(buffer, "wb");
        while ((ch = fgetc(source)) != EOF)
        {
            fputc(ch, target);
        }
    }

    fclose(source);
    fclose(target);

    return 0;
}

最佳答案

我认为主要的困惑在于您对命令行参数的处理。

当你做的时候

if (argc < 2)
    {
        printf("Source file must be specified.");   
    }

意思是

else if (argc == 1) { .... }

永远跑不掉,1当然小于2。

如果 argc 小于 2(即您未传递任何命令行参数),则采取的最佳措施是返回。这可以防止 fcloses 最后导致崩溃(或未定义的行为)。更好的做法是将关闭移动到 if block 内,或者最初将 NULL 分配给您的 FILE 指针,并在关闭它们之前检查是否为 NULL。

在检查 argc == 1 的地方,它应该是 argc == 2。如果 argc 为 1,则表示您没有命令行参数,因为第一个参数是可执行文件的名称。

还要注意这一行是错误的

if (buffer[length] == ".")

应该是

if (buffer[length] == '.')

你正在比较一个字符,而不是一个字符串(最终是一个指针),你应该在这里得到一个警告(比较整数和指针)。

关于c - 如何更改取自 C 行参数的字符串的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28203935/

相关文章:

windows - 如何识别批处理文件中的用户输入帮助(/?)

c - 用人物画一个设计

c - getenv() 的值在 strtok() 中不起作用

c - 使用 -pg 编译的 gcc 不会生成 gprof 所需的二进制文件

c# - 使用 C# CommandLine 库解析命令行参数

ffmpeg - 使用 FFMPEG 将 HEVC 视频多路复用为 MPEG 传输流

rust - 如何在所有子命令都为可选的情况下创建StructOpt命令

java - 清除给定的命令行字符串以匹配文件路径

c - 我没有使用 C 中的读写来正确地得到两个数字的总和?

c - 为什么 ld 没有从共享库中找到一些符号