gpt4 book ai didi

c - System() 调用后打印时 printf 出现意外行为

转载 作者:行者123 更新时间:2023-11-30 19:25:07 27 4
gpt4 key购买 nike

我有以下“main”函数以及相关的控制台输出。

argv[1] = "C:\\Program Files (x86)\\InstallShield Installation Information\\0x041f.txt"

int main(int argc, char **argv){
if (argc < 2)
{
printf("Please provide a file name with extension\r\n");
return 1;
}
unsigned char buf[LEN_NORM];
char filename[230];
char ali_dirname[200];
char bli_dirname[200];

FILE *fp_obj, *fp_det, *fp_txt = fopen(argv[1], "rb");
//dirty?
*(argv[1] + strlen(argv[1]) + 1 - 5) = '\0';
snprintf(ali_dirname, strlen(argv[1]) + 4, "%s/ali", argv[1]);
snprintf(bli_dirname, strlen(argv[1]) + 4, "%s/bli", argv[1]);

char cmd[200];
snprintf(cmd, strlen(argv[1]) + 12, "@RD /S /Q \"%s\"", argv[1]);
printf("cmd: %s\r\n", cmd);
system(cmd);
printf("cmd: %s\r\n", cmd);
}

cmd: @RD /S /Q "C:\Program Files (x86)\InstallShield Installation Information\0x041f"

The filename, directory name, or volume label syntax is incorrect.

tion Information\0x041f" iles (x86)\InstallShield Installa

Console output

正如您所看到的,系统调用后控制台完全损坏了。我真的无法理解为什么会发生这种情况。有什么想法吗?

编辑:谢谢您的反馈,我认为 snprintf 长度与要写入的数据的长度有关。 “cmd”具有固定长度,这是允许的最大大小。根据我在网上找到的信息,“大小”是将写入缓冲区的最大字节数(字符),所以在我的情况下,12应该是正确的数字(我用调试器检查过,\“是正确写入的)而不是 sizeof(cmd),我错了吗?我在所有“snprintf”情况下尝试过使用“12 + 1”(4 + 1)和“sizeof”,但没有任何变化

代码在“main”中运行(我已经更新了)

如果我删除“System(cmd)”调用,控制台输出就可以了!

最佳答案

  • 一个问题:一对一

strlen(argv[1]) + 12 是输出的预期长度,但它是所需的大小传递给 snprintf() - 需要加一。当前代码在打印到 cmd 时肯定会删除最后一个字符 '\"'

//                                   12345678901   2
snprintf(cmd, strlen(argv[1]) + 12, "@RD /S /Q \"%s\"", argv[1]);
// better
snprintf(cmd, strlen(argv[1]) + 12 + 1, "@RD /S /Q \"%s\"", argv[1]);

这并不能很好地解释 OP 输出末尾的 \0x041f(也许是 П ),但这肯定是一个问题。

<小时/>
  • 正确使用 cmd 的大小,最好在使用可能被截断的字符串执行系统命令之前测试结果。

    int len = snprintf(cmd, sizeof cmd, "@RD /S /Q \"%s\"", argv[1]);
    if (len < 0 || (unsigned) len >= sizeof cmd) {
    fprintf(stderr, "Forming `cmd` failed\n");
    } else {
    printf("cmd: %s\r\n", cmd);
    system(cmd);
    }
<小时/>

未发布的代码中可能存在其他问题。

关于c - System() 调用后打印时 printf 出现意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59287900/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com