C - ошибка с strcat

В чем ошибка в этом коде? У меня ошибка

error C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead

Что это значит? Другой вопрос - объявление структуры и прототипа функции является законным?

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

void main()
{
    char *join(char *, char *);
    printf("%s \n", join("duck", "soup"));   
}

char *join(char *s1, char *s2)
{
    struct {
        char buf[256];
    } string;
string.buf = "abcd";\\ new line. error l-value.
    return strcat(strcpy(string.buf, s1), s2);
}

Новая строка - почему возникает ошибка? не string.buf указатель на символ? в чем проблема char *s="abcd"? Спасибо!:)

3 ответа

Решение

Первое сообщение связано с тем, что strcat не проверяет, достаточно ли целевого хранилища для хранения объединенной строки. Вы можете получить переполнение буфера. strcat_s имеет дополнительный параметр, который является длиной буфера. Это обеспечит переполнение буфера.

Что касается второго вопроса, код в join() подделка Что вы делаете, это объявляете локальную переменную, которая является массивом из 256 символов. Как локальная переменная она будет "уничтожена", когда join() завершается.
Вы тогда копируете s1 в этот буфер. Обратите внимание, что буфер может быть слишком маленьким, и вы получите переполнение буфера.

Тогда вы звоните strcat с буфером локальной переменной в качестве первого аргумента. Результатом является то, что s2 будет добавлен к s1 в буфере локальной переменной. Возвращаемое значение strcat указатель на буфер когда join() возвращает, буфер "уничтожен" и указатель становится недействительным.

Обратите внимание, что другая проблема в вашем коде заключается в объявлении функции join() внутри главной. Вы должны переместить эту строку из основной функции.

То, как вы определили свою структуру и строковую переменную, является правильным. Это способ, которым вы выполняете join() это подделка

Сообщение об ошибке совершенно очевидно. Непонятно, что ты не понимаешь. Например, в вашем join функция, ужасные вещи произошли бы, если две строки вместе длиннее 255 символов.

Кроме того, ваш join функция полностью нарушена. Он возвращает указатель на буфер, который больше не существует, как только он возвращается, так как вы разместили его в стеке, из которого вы возвращаетесь.

Это ваша реализация, пытающаяся быть полезной.

Вы можете остановить это, добавив следующее #define в верхней части вашего кода

#define _CRT_SECURE_NO_WARNINGS

или следуйте предложению и используйте strcat_s(),

Другие вопросы по тегам