Попытка устранения неполадок конкатенации строки в C - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь объединить две строки вместе.Я поместил две строки в два массива и создал третий массив размером с две строки.Затем я использую цикл for для печати по одной букве за раз.

Программа получает This до сбоя.В IDE нет кодов ошибок или отладочных сообщений !!!Как мне отладить мою программу и какой образ мыслей мне следует иметь, если у меня нет очевидных сообщений об ошибках, которые нужно вывести, когда происходит что-то подобное?

#include <stdio.h>
#include <memory.h>
#include <malloc.h>

int pointerArrays() {
    char strOne[] = {"This is the first string array."};
    char strTwo[] = {"This is the second string array."};

    char *px, *py, *pz;
    px = strOne;
    py = strTwo;
    pz = (char *) malloc(1 + sizeof(px) + sizeof(py));
    strcpy(pz, px);
    strcpy(pz, py);

    for (int i = 0; i < sizeof(pz); i++) {
        printf("%c", pz[i]);
    }
    return 0;


}

int main(void) {

    pointerArrays();
    return 0;
}

Ответы [ 4 ]

0 голосов
/ 29 января 2019

с использованием sizeof очень опасно и в большинстве случаев не удастся.

достаточно изменить

char strOne[] = "This is the first string array.";
char strTwo[] = "This is the second string array.";

на

char strOne[64] = "This is the first string array.";
char strTwo[64] = "This is the second string array.";

или

char *strOne = "This is the first string array.";
char *strTwo = "This is the second string array.";

и результат вашей функции будет далек от ожидаемого.

Всегда используйте strlen для получения длины строки.

Здесь выесть гораздо более универсальное и безопасное решение:

char * concatenate (const char * str1, const char * str2) {size_t str1len = strlen (str1), str2len = strlen (str2);

char *res = malloc(str1len + str2len + 1);

if(res)
{
    strcpy(res, str1);
    strcpy(res + str1len, str2);
}
return res;

}

0 голосов
/ 29 января 2019

Вставьте еще одну строку, чтобы увидеть, что получает аргумент malloc():

printf ("malloc(%d)\n", 1 + sizeof(px) + sizeof(py));

Могу поспорить, что вы можете понять это оттуда.

0 голосов
/ 29 января 2019

Есть две проблемы.Во-первых, это здесь не работает:

malloc(1 + sizeof(px) + sizeof(py));

sizeof(px) не оценивает размер строки, он просто оценивает размер char*, что нечто ты намеревалсяВместо этого попробуйте что-то вроде этого:

pz = (char *)malloc(strlen(strOne) + strlen(strTwo) + 1);

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

strcat(pz, py);

Вместо того, чтобы снова strcpy.

В примечании, когда вы печатаете строку, вместо того, чтобы просто проходить по массиву, вы также можетепросто используйте спецификатор формата %s:

printf("%s", pz);

И последнее, но не менее важное: не забудьте освободить память, когда закончите:

free(pz);
0 голосов
/ 29 января 2019

Просто sidenote (не причина вашего сбоя): вы копируете в одно и то же место дважды:

    strcpy(pz, px);
    strcpy(pz, py);

должно быть

    strcpy(pz, px);
    strcpy(pz + strlen(px), py);

, не исправляя это, приведет к тому, что y направо больше O * x

Но главная проблема заключается в использовании sizeof вместо strlen.sizeof вернет размер указателя (обычно 4 или 8), тогда как strlen фактически вернет длину строки (что вы и ожидали)

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