char *str
をchar c[]
にコピーしようとしていますが、セグメンテーション違反または無効な初期化エラーが発生しています。
なぜこのコードはseg faultを私に与えているのですか?
char *token = "some random string";
char c[80];
strcpy( c, token);
strncpy(c, token, sizeof c - 1);
c[79] = '\0';
char *broken = strtok(c, "#");
strncpy()
ではなく strcpy()
を使用します
/* code not tested */
#include <string.h>
int main(void) {
char *src = "gkjsdh fkdshfkjsdhfksdjghf ewi7tr weigrfdhf gsdjfsd jfgsdjf gsdjfgwe";
char dst[10]; /* not enough for all of src */
strcpy(dst, src); /* BANG!!! */
strncpy(dst, src, sizeof dst - 1); /* OK ... but `dst` needs to be NUL terminated */
dst[9] = '\0';
return 0;
}
char *str = "Hello";
char c[6];
strcpy( c, str );
strncpyを使用して、char []に含まれているよりも多くの文字をコピーしないようにします
char *s = "abcdef";
char c[6];
strncpy(c, s, sizeof(c)-1);
// strncpy is not adding a \0 at the end of the string after copying it so you need to add it by yourself
c[sizeof(c)-1] = '\0';
編集:コードが質問に追加されました
コードを表示すると、セグメンテーション違反は行ごとである可能性があります
strcpy(c, token)
問題は、トークンの長さがcの長さより大きい場合、メモリがc変数からいっぱいになり、問題が発生することです。
char c []にはある程度のサイズが必要です。
例えば
char c[]= "example init string";
//テーブルcをc [19]に設定する;プログラムの最初から直接割り当てることができます。
char c[19] = {0}; // null filled table
char c [i]はポインタなので、何もコピーする必要はありません。 char c [19]; c = "サンプル初期化文字列"; //今は&c [0]が同じアドレスを指しています。
コピーはできます
strcpy(dst, src);
しかしMSはあなたに安全な機能を使うことを強制します:
strcpy_s(dst,buffsize,src);
編集:コードを追加していただきありがとうございます。
おそらく、segfaultがここで発生します。
strncpy(c, token, sizeof c - 1);
sizeofの優先順位は右から左への「-」と同じであるため、おそらく次のように処理されます。
strncpy(c, token, sizeof( c - 1 ) );
の代わりに
strncpy(c, token, sizeof(c) - 1);
これはおそらくあなたが欲しかったものです
(参照: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence )
私がc/c ++でコーディングしてから久しぶりですが、c [80]はおそらくスタックに割り当てられます。 char * cとstrdupまたはsimiliarを使用すると、strtokがアクセスできるヒープに割り当てられます。
このようなものを試してください。
char *token = "some random string";
char *c;
c = strdup(token);
char *broken = strtok(c, "#");
free(c);