Скопируйте строку в другую строку с помощью указателей в динамическом - PullRequest
1 голос
/ 18 октября 2019

Попытка скопировать строку в другую строку. Как основной ученик, я старался изо всех сил, чтобы получить результат, но в конце программы (точка 1) моя логика не работает должным образом. Пожалуйста, ознакомьтесь с моим входом и выходом, приведенным ниже, чтобы получить четкое представление.

Эта программа копирует строку.

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int n1,n2,loc;
    char *p1, *p2;

    printf("Enter size of p1\n");
    scanf("%d", &n1);

    p1 = (char*) malloc (n1 * sizeof(char));

    printf("Enter the P1 String\n");
    fflush(stdin);
    gets(p1);

    printf("\nEnter the size of p2\n");
    scanf("%d", &n2);

    p2 = (char*) malloc (n2 * sizeof(char));

    printf("Enter the P2 String\n");
    fflush(stdin);
    gets(p2);

    printf("\nEnter the Location to copy\n");
    scanf("%d", &loc);

    for(int i=loc-1;i<=n1;i++) //point 1
    {
       *(p1+i) = *(p1+i)+n2;
    }

    for(int i=0;i<=n2;i++)
    {
       *(p2+i) = *(p1+i)+loc;
    }

    printf("\n Final copy is\n");
        printf("%d",p1);

    free(p1);
    free(p2);

    return 0;
}

Ожидается:

Input:
google
microsoft

output:
Goomicrosoftgle

Фактически:

Input:
google
microsoft

output:
[Some garbage values including given string]

Ответы [ 2 ]

1 голос
/ 19 октября 2019
  • Прежде всего, не используйте gets(), поскольку небезопасно для использования, а также не рекомендуется
  • p1 и p2 динамически распределяются впамяти, и они имеют свои собственные размеры n1 и n2 соответственно. Таким образом, когда вы добавляете больше символов из p2 в p1, размер вывода должен быть увеличен, иначе они не поместятся в этом пространстве памяти
  • Для ввода строки с использованием scanf выделенногопамять должна быть на единицу больше, чем фактическая длина, так как в конце вставляется один нулевой завершающий символ
  • В вашем последнем операторе печати вы используете %d, который является спецификатором формата для целочисленного типа, так что выследует использовать %s при печати всей строки

Итак, это должно работать:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n1, n2, loc;
    char *p1, *p2, *output;

    printf("Enter size of p1: ");
    scanf("%d", &n1);

    p1 = malloc((n1 + 1) * sizeof(char));

    printf("Enter the P1 String: ");
    scanf("%s", p1);

    printf("\nEnter the size of p2: ");
    scanf("%d", &n2);

    p2 = malloc((n2 + 1) * sizeof(char));

    printf("Enter the P2 String: ");
    scanf("%s", p2);

    printf("\nEnter the Location to copy: ");
    scanf("%d", &loc);

    output = malloc((n1 + n2 + 1) * sizeof(char));

    for (int i = 0; i < loc; i++)
        *(output + i) = *(p1 + i);

    for (int i = loc - 1; i <= n1; i++)
        *(output + i + n2) = *(p1 + i);

    for (int i = 0; i < n2; i++)
        *(output + i + loc) = *(p2 + i);

    printf("\nFinal copy is: ");
    printf("%s\n", output);

    free(p1);
    free(p2);
    free(output);

    return 0;
}

Вот вывод:

Enter size of p1: 6
Enter the P1 String: google

Enter the size of p2: 9
Enter the P2 String: microsoft

Enter the Location to copy: 3

Final copy is: goomicrosoftgle
0 голосов
/ 20 октября 2019

Вот правильная логика копирования строки динамическим методом.

output = malloc((n1 + n2 + 1) * sizeof(char)); // После выделения памяти для обоих размеров строки и добавления памяти для NULL.

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