Нежелательный символ @ в конце строки ISO C конкатенации - PullRequest
0 голосов
/ 17 мая 2019

Этот код печатает foobar @.Здесь @ не должно приходить. Я не знаю, почему это происходит. Это ISO C. Надеюсь, кто-то исправил эту проблему раньше.

#include <stdio.h>
#include <string.h>

int main(void)
{
    char *str1 = (char*)"foo";
    char *str2 = (char*)"bar";

    char ccat[strlen(str1)+strlen(str2)];

    strncpy(&ccat[0], str1, strlen(str1));
    strncpy(&ccat[strlen(str1)], str2, strlen(str2));

    puts(str1);
    puts(str2);
    puts(ccat);
}

Ответы [ 2 ]

3 голосов
/ 17 мая 2019

Помните, что в строке C вам понадобится общая длина плюс еще один байт для символа NUL-терминатора .Это означает, что вам нужно:

char ccat[strlen(str1)+strlen(str2)+1];

Так как вы не выделяли достаточно места для последнего персонажа, вы получаете случайный мусор, например @, или это может быть что угодно.Или ничего.

Во-вторых, вы запрещали strncpy применять полную строку, включая терминатор NUL.Это привело к неполной записи.Правильное завершение необходимо, поэтому быстрое исправление - strlen(str1)+1, но вы должны описать длину принимающего буфера , чтобы предотвратить переполнение, а не длину того, что вы пишете.

Вам также потребуется либо добавить терминатор NUL вручную, либо изменить способ добавления строк.Этот подход может быть лучше:

#include <stdio.h>
#include <string.h>

int main(void)
{
    char *str1 = "foo";
    char *str2 = "bar";

    char ccat[strlen(str1)+strlen(str2)+1];

    // The length limit on the first one is the length of the buffer - 1
    strncpy(ccat, str1, sizeof(ccat)-1);
    // The length limit on the second is that minus the length of what's in there
    strncat(ccat, str2, sizeof(ccat)-strlen(ccat)-1);

    puts(str1);
    puts(str2);
    puts(ccat);

    return 0;
}

Стоит отметить, что ваш компилятор может предупредить (-Wall) о распространенных проблемах переполнения, если вы запутались, как в следующем примере:

the value of the size argument in 'strncat' is too large, might lead to a buffer overflow [-Wstrncat-size]
0 голосов
/ 18 мая 2019
#include <stdio.h>
#include <string.h>

int main(void)
{

    char str1[] = "foo";
    char str2[] = "bar";


    char ccat[strlen(str1)+strlen(str2)];

    strncpy(&ccat[0], str1, strlen(str1));
    strncpy(&ccat[strlen(str1)], str2, strlen(str2));
    ccat[strlen(str1)+strlen(str2)]='\0';

    puts(str1);
    puts(str2);
    puts(ccat);
    printf("\n%s", ccat);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...