0

このコードのエラーは何ですか? エラーが発生しました

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.bufchar ポインタではありませんか? 何が問題なのchar *s="abcd"? ありがとう!:)

4

3 に答える 3

1

最初のメッセージは、連結された文字列を保持するのに十分な大きさのターゲット ストレージがあるかどうかを strcat がチェックしないためです。バッファ オーバーフローが発生する可能性があります。strcat_sバッファ長である追加のパラメータがあります。バッファオーバーフローがないことを確認します。

2 番目の質問については、コードjoin()は偽物です。行うことは、256 文字の配列であるローカル変数を宣言することです。ローカル変数として、終了時に「破棄」されjoin()ます。次に、このバッファー
にコピーします。s1バッファーが小さすぎると、バッファー オーバーフローが発生する可能性があることに注意してください。

strcat次に、ローカル変数 buffer を最初の引数として呼び出します。結果は、ローカル変数バッファーにs2追加されます。s1によって返される値strcatは、バッファー上のポインターです。戻るとjoin()、バッファは「破棄」され、ポインタは無効になります。

コードのもう 1 つの問題はjoin()、main 内で関数を宣言することです。この行をメイン関数の外に移動する必要があります。

構造体と文字列変数を定義した方法は正しいです。join()それはあなたが偽物であることを実行する方法です。

于 2015-02-26T10:33:32.093 に答える