Нарушение доступа с помощью strcat () - PullRequest
0 голосов
/ 04 ноября 2019

В моем коде у меня есть цикл for для преобразования char в char из другого массива, начиная с определенной точки. Так, например, если текст «привет, мне нужна помощь» и мой начальный индекс равен 10, это будет означать «помощь» до конца символа * rs.

for (int l = start_index; l < strlen(text); l++) {
    strcat(rs, "h");
}

Я протестировал вышеописанное, и он отлично работаетбез ошибок, но это

for (int l = start_index; l < strlen(text); l++) {
    strcat(rs, text[l]);
}

нет. Согласно отладчику «text» - это char [256], а «rs» - это * char, если это помогает. Отладчик также показывает, что текст [l] имеет правильное значение в этом перечислении.

1 Ответ

2 голосов
/ 04 ноября 2019

Функция strcat принимает две строки (указатели на char) в качестве аргументов. Из контекста кажется, что text[l] - это один char, который не может быть использован.

Один из способов обойти это - создать небольшую односимвольную временную строку для символа:

for (int l = start_index; l < strlen(text); l++) {
    char temp[] = { text[l], '\0' };  // Don't forget the terminator
    strcat(rs, temp);
}

Другое решение состоит в том, чтобы вообще не использовать strcat, а вместо этого использовать индексирование строки rs для непосредственного присвоения элементам строки:

size_t end_of_rs = strlen(rs);
for (int l = start_index; l < strlen(text); l++) {
    rs[end_of_rs++] = text[l];
}
rs[end_of_rs] = '\0';  // Make sure string is terminated

Илигораздо более простое решение: объединить непосредственно из text:

strcat(rs, &text[start_index]);

Но для этого вы должны убедиться, что start_index не выходит за пределы text (т.е. вам необходимо убедиться, что start_index < strlen(text)).

...