sprintf добавляет дополнительный символ в массив символов

Я пишу какую-то программу и в какой-то момент своего кода просматриваю каталог. Чтобы сделать строку, соответствующую пути и имени файла, у меня есть этот код:

char *aux;
aux = (char *) malloc(strlen(directory) + strlen(files[j] + 1));

sprintf(aux, "%s/%s", directory, files[j]);

//Debugging...
char b[100]; sprintf(b, "Path + file: %s\n", aux); write(1, b, strlen(b));
char c[100]; sprintf(c, "File: %s\n", files[j]); write(1, c, strlen(c));

Когда я выполняю свою программу, я получаю вывод:

Path + file: ./Path/file.txt!
File: file.txt

Как видите, в первой строке вывода файл имеет лишний символ (!), который не принадлежит ни пути, ни файлу (как вы можете видеть во второй строке вывода). Я также пытался настроить размер malloc на разные значения, и это все еще происходит. Почему?


c
person user157629    schedule 03.01.2021    source источник
comment
Тщательно подсчитайте требуемые символы и помните, что они нужны для разделителя в дополнение к обеим строкам и, разделяющим '/' . Итак, насколько большим был этот маллок? Ваша программа вызывает неопределенное поведение.   -  person WhozCraig    schedule 03.01.2021
comment
ПОЖАЛУЙСТА, отредактируйте вопрос и покажите минимально воспроизводимый пример. слишком много деталей отсутствует.   -  person OldProgrammer    schedule 03.01.2021
comment
Вам не нужно приводить malloc - см. приведение malloc к плохим   -  person Ed Heal    schedule 03.01.2021
comment
Вам нужно место для символа EOS, но вы делаете это неправильно. Кроме того, вам нужно место для добавляемого /. Вы хотите: aux = malloc(strlen(directory) + strlen(files[j]) + 1 + 1);   -  person Craig Estey    schedule 03.01.2021
comment
Действительно, так и было...   -  person user157629    schedule 03.01.2021
comment
Ручной подсчет количества символов обязательно приведет к ошибкам. Вот почему в GNU libc есть asprintf, она автоматически выделяет вам правильную сумму. Для систем без GNU libc посмотрите здесь, чтобы узнать, как реализовать это самостоятельно.   -  person koder    schedule 04.01.2021