2017-11-15 23 views
-1

文字列を保持する文字列 "prompt"があります。ユーザーは収集した文字列(トークン)をcharの配列に区切って(区切り文字として空白を使用して)入力したプロンプトを変更できる必要があります。Cでは、文字列の配列の要素を別の文字列にコピーできません

たとえば、仮定:

char **tokens[2] = {"setprompt", "newprompt"}; 
char *prompt = "oldprompt"; 

if(strcmp(tokens[0], "setprompt") == 0) 
{ 
strcpy(prompt, tokens[1]); 
} 

strcmp()機能が完全に正常に動作し、それはstrcpy()に到達したときただし、tokens[1]の要素は、(文字列"newprompt"である)文字列プロンプトにコピーされません。これは私の問題です。

代わりにstrncpy()を使用することに加えて、トラブルシューティングを試みましたが、各変数/ポインタの宣言のどこかに問題があると思います。どんな援助やアイデアも素晴らしいだろう。

注:実際のプログラムでは、トークン配列のサイズは2ではありません。この例は簡単にするために変更されています。ありがとう!

+0

コンパイラの警告を有効にします。 'char ** tokens [2] = {" setprompt "、" newprompt "};' - > "警告:互換性のないポインタ型からの初期化"。 – chux

+1

'char **トークン[2] = ...' - > 'char *トークン[2] = ...' '*'が多すぎます。 [@Michael Dorgan](https://stackoverflow.com/a/47297880/2410359)は、別の問題を抱えています。 – chux

答えて

3

あなたの問題は、この行です:

char *prompt = "oldprompt"; 

それは一定のメモリを指すと(それが定義されている方法を)変更することはできません。読み取り専用にして、コピーや変更のために独自のバッファを作成することを検討してください。

#define MAX_STRING_SIZE 255 

char *tokens[2] = {"setprompt", "newprompt"}; 
char *prompt = "oldprompt"; 
char myBuffer[MAX_STRING_SIZE]; 

strcpy(myBuffer, prompt); 

if(strcmp(tokens[0], "setprompt") == 0) 
{ 
    strcpy(myBuffer, tokens[1]); 
} 
+0

この猫にはたくさんの方法があります。私は何か非常にシンプルで理解しやすいものを使い始めました。クラッシュの原因となるコピーについて実行時エラーが発生していないことに驚いています。 –

+0

'char ** tokens [2] = {" setprompt "、" newprompt "};'参照[コメント](https://stackoverflow.com/questions/47297861/in-c-im-unable-to-copy-文字列から文字列への単一要素の要素#comment81548105_47297861)。これは貧弱なコードです。 – chux

+1

ええ、いいキャッチ。 –

関連する問題