Функция дублирует ввод как и должна но добавляется "Мусор" - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Функция дублирует ввод как и должна но пробавляются "Мусор"
char *duplicate(char *str)
{
    char *s={NULL};
    int   i;
    int   j;
 
    printf("The current string is: ");
    present(str);
 
     s = (char *)malloc(2*strlen(str)*sizeof(char)-1);         
 
    if(s == NULL) {printf("Sorry no memory"); return NULL;}  
    _flushall();    
 
    for (i=0;i<strlen(str);i++)                             
        s[i]=str[i];
    for (j=0;j<strlen(str);j++)
        s[j+strlen(str)]=str[j];
 
    printf("The duplicated string is: ");
    present(s);
    free(str);
    return s;
    
}
Что это может быть ? Спасибо

Решение задачи: «Функция дублирует ввод как и должна но добавляется "Мусор"»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
char* duplicate(const char* const str)
{
  char* newStr = NULL;
  size_t newLength = (strlen(str) * 2 + 1);
 
  newStr = malloc(newLength * sizeof(*newStr));
  if (newStr != NULL)
  {
    memcpy(newStr, str, strlen(str) * sizeof(*str));
    memcpy(newStr + strlen(str), str, strlen(str) * sizeof(*str));
    newStr[newLength - 1] = '\0';
  }
 
  return newStr;
}
 
int main(void)
{
  char s1[] = "This is a test!";
  char* s2 = NULL;
 
  s2 = duplicate(s1);
 
  printf("'%s'\n", s2);
 
  free(s2);
 
  return 0;
}

Объяснение кода листинга программы

  1. В функции duplicate создается новая строка newStr равная NULL.
  2. Вычисляется новая длина строки newLength - удваивается длина исходной строки str и добавляется 1.
  3. С помощью malloc выделяется память под новую строку newStr длиной newLength.
  4. Если память успешно выделена, то происходит копирование исходной строки str в новую строку newStr и newStr + strlen(str) с помощью функции memcpy.
  5. В конце новой строки newStr добавляется символ конца строки \0.
  6. Функция возвращает новую строку newStr.
  7. В функции main создается строка s1 равная This is a test!.
  8. Строка s1 передается в функцию duplicate и сохраняется в переменной s2.
  9. С помощью функции printf выводится содержимое переменной s2.
  10. С помощью функции free освобождается память, выделенная под строку s2.
  11. Функция main возвращает 0, завершая работу программы.

Оцени полезность:

9   голосов , оценка 3.667 из 5