2015-02-26 1 views
0

Какая ошибка в коде? У меня есть ошибка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"? Спасибо! :)

+2

Что вы не понимаете по поводу сообщения точно? –

+0

Глупый компилятор жалуется на strcat вместо strcat_s. Полное игнорирование сбоя, который, скорее всего, после возвращения функции (см. Ответ ниже). – gnasher729

+0

Что небезопасно? Я использую этот «strcat» много! –

ответ

1

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

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

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

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

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

+0

спасибо !! У меня есть другой вопрос. Я написал "string.buf =" abcd ";" но у него была ошибка «левый операнд должен быть l-значением». почему это? string.buf не является указателем на char? –

+1

Это означает, что вы не можете присвоить слово 'string.buf'. Это массив, а не указатель. Вы должны скопировать строку '' abcd'' в 'string.buf' с помощью' strcpy' или предпочтительно 'strcpy_s', чтобы убедиться, что переполнение буфера отсутствует. – chmike

5

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

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

+1

Не то, чтобы strcat_s вам много хорошего, когда их больше 255 символов. Вы по-прежнему не получаете правильной конкатенации двух строк. Если вы не проверите возвращаемое значение, это будет тихая ошибка в вашем коде, а не сбое. Если вы проверите возвращаемое значение, у вас все еще нет конкатенированных строк. – gnasher729

2

Это your implementation trying to be helpful.

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

#define _CRT_SECURE_NO_WARNINGS 

или следовать предложению и использовать strcat_s().