0

カスタム IOS ライブラリに C を使用しています。XCode を 5.0 開発者プレビューにアップグレードしました。今strcpyは私には機能しません。その時点でアプリがクラッシュします。何が問題なのか誰でも説明できますか?

アップデート

これが私のコードです:

char global[] = " ";
printf("Error opening %s for constants input\n", lang); 
strcpy(global, lang); 

langではprintf機能していますが、strcpy は機能していません。

4

4 に答える 4

5

globalとして宣言すると

char global[] = " ";

2文字分のスペースしかありません。スペースと文字列ターミネータ。コピーしようとする文字列全体を含むのに十分な大きさのサイズを設定するか、ポインタにして動的に割り当てます (この場合、文字列ターミネータにスペースを割り当てることを忘れないでください)。

于 2013-09-04T09:47:58.193 に答える
1

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

于 2013-09-04T10:48:14.340 に答える