2016-09-04 15 views
2

文字の配列を逆にすることはできませんが、私はここではCの文字列を逆にする簡単なプログラムを作ったが、私のコードです:C:文字列

#include <stdio.h> 

    int main(){ 
      char istring[] = {'f','o','o','b','a','r'}; 

      char revstring[sizeof(istring)]; 

      for(int i = 0; i < sizeof(istring); i++){ 
        int cplace = sizeof(istring)-i-1; 
        revstring[cplace] = istring[i]; 
      } 
      printf("%s",revstring); 
      return 0; 
    } 

raboofが期待通りに私の結果は、です。

char istring[] = {'f','o','o','b','a','r'};char istring[] = "foobar";と交換すると、出力として何も得られません。どうしましたか?

ありがとうございます。

はCで

答えて

3

(これは総初心者の質問がある場合は申し訳ありませんが)、文字列はNULLで終わる文字の配列です。元のプログラムでは、istringは文字列ではなく、最後にヌルバイトがない文字の配列です。

文字を正常に反転させると、末尾に終端ヌルバイトがないため、revstringは文字列ではありません。そのため、printfの形式指定子%sを使用して文字列として出力しようとすると、配列の最後を過ぎて検索されます。配列の範囲を超えて読むことはundefined behaviorです。

定義されていない動作は、プログラムが正しく動作するように見えるということの1つです。あなたのケースでは、あなたは "幸運"を得て、期待される結果を得ました。

istringistring[] = "foobar";と定義すると、NULL終端バイトを含む文字列定数で初期化されます。したがって、この定義は実際には1バイト大きくなります。

文字を逆にすると、実際にはnullバイトが含まれます。結果の配列には、ヌルバイトとそれに続く他の文字が含まれています。それからあなたがそれを印刷すると、ヌルバイトが最初に見られるので、あなたが持っているものは空の文字列です。

ループでは、sizeof(istring)の代わりにstrlen(istring)を上限として使用します。最後にヌルバイトを追加します。

char istring[] = "foobar"; 
char revstring[sizeof(istring)]; 

for(int i = 0; i < strlen(istring); i++){ 
    int cplace = strlen(istring)-i-1; 
    revstring[cplace] = istring[i]; 
} 
revstring[strlen(istring)] = '\0'; 

あなたは文字の配列としてistringを定義する場合、あなたはrevstringに余分なバイトを割り当て、上限をチェックするときsizeofを維持する必要があります。

char istring[] = {'f','o','o','b','a','r'}; 
char revstring[sizeof(istring)+1]; 

for(int i = 0; i < sizeof(istring); i++){ 
    int cplace = sizeof(istring)-i-1; 
    revstring[cplace] = istring[i]; 
}  
revstring[sizeof(istring)] = '\0'; 
4

sizeof "foobar"が、ないです6。 C文字列はNULで終わり、'\0'文字で終了します。

最初の例は、NULが文字列を終了できず、'r''f'がスワップしないために機能します。あなたは逆の文字列に続くアドレススペースがをゼロ(これは'\0'に等しい)と評価し、その文字列を終わらせていることにうんざりです。それ以外の場合は、終了していない文字列を出力すると、未定義の動作が呼び出されます。

"foobar"を指定すると、'f''\0'がスワップされ、結果のC文字列の長さは実質的にゼロになります。

strlenを使用して文字列の長さを取得します(sizeofはメモリブロックの長さになりません)。 string.hヘッダーを含める必要があります。

char str[] = "foobar"; 
size_t str_len = strlen(str); 

char rev[str_len + 1]; 
rev[str_len] = '\0'; 

for (int i = 0; i < str_len; i++) 
    rev[i] = str[str_len - i - 1]; 

printf("%s\n", rev);