2016-10-19 3 views
2

これは実際にK & RCブックを通過しているので、私はそれが古くて、セキュリティ面が、私は単にexcercisesをしようとしています)私は指針で私自身のstrcatを実装する必要があるエクササイ5-2で遊んでいた。私のコードは次のとおりです:Cのポインタを学ぶ私は実際にこれが動作していない理由を把握できません(K&R excercise 5-2)

#include <stdio.h> 
#include <stdlib.h> 

char *Strcat(char *string1, const char *string2); 

int main(void){ 
    char string1[100]="hello"; 
    char string2[100]="1234"; 
    printf("%s",Strcat(string1,string2)); 
    return 0; 
} 

char *Strcat (char *string1, const char *string2){ 
    int i=0; 
    char *temp=string1; 
    while(*string1){// move the pointer to find the end of the string 
    ++string1; 
    } 
    while(*string1++=*string2++)//copy string 2 at the end of string 1 
    ; 
    puts(string1);//print string 1 concatenated with string 2 
    return temp;//send back temp pointing to string1 for printing 
} 

私は文字列1を印刷しようとすると空白が表示されるのですか?それは全体の文字列を印刷すべきではありませんか?私はそれが '\ 0'を見つけるまでprint関数を実行するので、私はtempを印刷しても問題ありませんが、文字列1でしようとすると '\ 0'にポインタがstring1 [0]それはおそらく単純なものですが、なぜこれが起こっているのかわかりません...

何か助けていただきありがとうございます!ありがとう!

+1

'++ string1'。あなたは元の文字列の始まりを失ってしまいました。 – kaylum

+0

こんにちはKaylum!早速のお返事ありがとうございます!私は思っていたので、どういうわけか私の考えは、魔法のように関数putsがstring1の先頭にポインタを戻すことを考え続けていましたが、今のところstring1が私はそれを動かした位置づけになった。 もう一度おねがいします! :D – jaferic

+0

代わりに 'puts(temp);'を使用してください。これはtempの値です –

答えて

4

++string1は、string1 = string1 + 1に相当する変数に影響します。だから、string1を印刷しようとすると、もはや元の文字列の先頭を指していません。

-1

文字列が配列の先頭を指していません。インクリメント操作に起因する。

+0

ありがとうございます!!! – jaferic

-1

kaylumが指摘したように、ポインタstring1のトラックが失われました。最初に、tempの一時ポインタを割り当てて、元のstring1の場所を保存します。ファンクションのStrcatファンクションで使用する必要があります。ところで

puts(temp); 

、この3行

while(*string1){// move the pointer to find the end of the string 
++string1; 
} 

は、単一の行のように書くことができる:

while(*string1++); 
+0

ありがとうartm!はい、あなたは正しいです!しばらくの間、余分な線は必要ありません、観測のおかげで! :) – jaferic

+0

while(* string1 ++); ':もう1つカウント(' '\ 0''を過ぎて) – BLUEPIXY

関連する問題