我正在尝试编写一个简单的备份程序。它将接收一个文件,然后创建一个具有相同内容的文件,除非指定,否则扩展名为 .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/