web-dev-qa-db-ja.com

Cでchar * stringをchar c []にコピーする方法は?

char *strchar 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, "#");
11
Alex Xander

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;
}
19
pmg
char *str = "Hello";
char c[6];
strcpy( c, str );
2
Paul Mitchell

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変数からいっぱいになり、問題が発生することです。

1

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);
0
bua

編集:コードを追加していただきありがとうございます。

おそらく、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

0
dstibbe

私が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);
0
Johan Soderberg