2016-08-19 4 views
-4

私はこのコードを実行しました:strcpyまたはstrcatは、printf文の中で使用すると文字列を不必要に変更しますか?

#include<stdio.h> 
#include<string.h> 

int main() 
{ 
static char str1[] = "dills"; 
static char str2[20]; 
static char str3[] = "Daffo"; 
int i,j; 
i = strcmp(strcat(str3, strcpy(str2, str1)), "Daffodills"); 
printf("%d", i);printf("\n"); 
printf("%s",str1);printf("\n"); 
printf("%s",str2);printf("\n"); 
printf("%s",str3);printf("\n"); 
printf("%s",strcpy(str2, str1));printf("\n"); 
printf("%s",strcat(str3, strcpy(str2, str1))); 
return 0; 
} 

出力:str1が "病気" になった方法

0 
ills 
dills 
Daffodills 
ills 
Daffodillsills 
  1. を?
  2. なぜstrcpyが "ills"を返すのですか?
  3. strcat(str3、strcpy(str2、str1))がDaffodillsを返しても、strcmpの答えは0です。なぜですか?
+1

あなたはどう思いますか?中間結果を分析しましたか?何故なの?デバッガは何を言いますか?あなたは何を期待しましたか? – Olaf

+3

'str3'はあなたの最初の' strcat() '呼び出しに十分な大きさではありません。おそらく他の配列の一部を上書きするでしょう。 – Dmitri

+1

行ごとに 'printf()'を呼び出すのではなく、最初の 'printf()'書式文字列に改行を入れる必要があります。つまり、 'printf("%d "、i); printf(" \ n ");'は 'printf("%d \ n "、i);' –

答えて

4

あなたはが連結された値を格納するためのstr2に十分なスペースを持っている。しかし、ご注文の電話番号はstr3になります(つまりstr2)。また、長さの問題がなくてもdillsDaffoが得られるので、さらに並べ替えが必要です。

の代わりに:

i = strcmp(strcat(str3, strcpy(str2, str1)), "Daffodills"); 

このお試しください:UPDATE

i = strcmp(strcat(strcpy(str2, str3), str1), "Daffodills"); 

を:

オリジナルコードのすべてのバグは、本質的に試みることによって引き起こされますすべてをやるn 1つの単一行。その面倒なラインをいくつかに分割する方がはるかに良いでしょう。

はい。私はこれについて編集をして議論していた。だから、ここに行く...

通常、私は通常このようなことをするときに、私は通常それぞれの連結を別々に行う。すべてconcatentationsは(strcpyする必要が最初の1対)strcatことができるように、私もターゲットバッファを準備を:

str2[0] = 0; 
strcat(str2,str3); 
strcat(str2,str1); 
i = strcmp(str2,"Daffodills"); 

私にとって、これは、明確に簡単、かつより柔軟です。必要に応じてより多くの連結を追加するか、順序が狂っている場合に並べ替えることは簡単な問題であるため、より柔軟に対応できます。

Cの多くの類似したシーケンスと同様に、オプティマイザはlong/compound文と同様に効率的なコードを生成します。

+0

でなければなりません。 1つの行ですべてをやろうとすることによって。その面倒なラインをいくつかに分割する方がはるかに良いでしょう。 – Lundin

+0

@ Lundin元の投稿に分割された例を追加するのにはとても近くていました。その後、私はそれを放棄したと感じていた。それから、質問は保留になりました。あなたのコメントは、私がとにかくやりたかったことをするために私を元気づけました。ナッジに感謝... –

関連する問題