неожиданное поведение printf при печати после вызова System () - PullRequest
0 голосов
/ 11 декабря 2019

У меня есть следующая «основная» функция с соответствующим выходом консоли.

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 Информация об установке\ 0x041f "

Неверный синтаксис имени файла, имени каталога или метки тома.

информация о файле \ 0x041f" iles (x86) \ InstallShield Installa

Console output

Как вы можете видеть после системного вызова, консоль полностью сломана. Я действительно не могу понять, почему это происходит. Любая идея?

РЕДАКТИРОВАТЬ: Спасибочто касается обратной связи, я подумал, что длина snprintf примерно равна длине данных, которые нужно записать. "cmd" имеет фиксированную длину, которая является максимально допустимым размером. Согласно информации, которую я нашел в сети, "размер" - это максимальное количество байтов(символы), которые будут записаны в буфер, поэтому в моем случае 12 должно быть правильным числом (я проверил с помощью отладчика и правильно написано \ "), а не sizeof (cmd), я не прав? Я пробовал с "12 + 1" (4 + 1) и с "sizeof" во всех случаях "snprintf", но ничего не меняется

Код работает в "основном" (я обновил его)

Если я уберу "System (cmd)", вызов консоли будет в порядке!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...