strcpy
ターゲット配列に十分なスペースがあることが確実でない限り、 の使用は避けてください。
安全なバージョンのためにこれを試してください。lang
おそらく適合しないため、それでもかなりうまく機能しますが、安全です。
char global[] = " ";
// alternative 1
snprintf(global, sizeof global, "%s", lang);
// alternative 2, more lines but also slightly more efficient
global[0] = 0;
strncat(global, lang, (sizeof global) - 1); // -1 needed to allow room for '\0'
snprintf
参照用に、およびのマニュアル ページを参照してくださいstrncat
。
スペースの問題を解決するには、可能なglobal
すべてのlang
文字列を保持するのに十分な大きさにする必要があります。
char global[16] = ""; // room for 15 characters, contents initialized to all 0
snprintf(global, sizeof global, "%s", lang);
別の方法として、動的メモリを使用する方法があります。
int bufsize = strlen(lang) + 1;
char *global = malloc(bufsize); // contents uninitialized
// can't use sizeof, it would give size of pointer, not allocated buffer
snprintf (global, bufsize, "%s", lang);
...
free(global); global = NULL;
動的メモリを使用する場合は、 (上記のリンク)asprintf
と同じ man ページに記載されている も参照してください。snprintf
C99 の可変長配列の使用を検討することもできますが、変数名がglobal
の場合、おそらくあなたのケースではうまくいかないでしょう:
char global[strlen(lang) + 1] = ""; // +1 for '\0', contents initialized to all 0
snprintf (global, sizeof global, "%s", lang); // now sizeof works again
// global is unallocated when it goes out of scope
の現在のコンテンツに十分なメモリを割り当てた動的メモリを使用すると、安全に収まることがわかっlang
ている場合でも使用できることに注意してください。それでも、安全なバージョンを使用すると、新しいバグを導入する将来の変更に対してより堅牢になる可能性があります。strcpy