0

char * end = str誰かがline2: と line4:が何をするのか理解するのを手伝ってくれますif (str)か?

void reverse(char *str) { 
   char * end = str; 
   char tmp;
   if (str) {
      while (*end) { 
         ++end;
      }
      --end;
      while (str < end) {
         tmp = *str; 
         *str++ = *end; 
         *end-- = tmp;
      } 
   }
} 
4

1 に答える 1

4

このif (str)テストにより、null ポインターの逆参照とクラッシュを防ぐことができます。

この定義でchar *end = str;は、変数end、文字ポインターを定義し、格納されている値str(指す文字列の最初の文字のアドレス) で初期化しstrます。

コードの残りの部分は、文字列の長さを決定し、文字列の中央に向かって、両端から文字のペアを交換するように調整します。技術的には、空の文字列 (文字列の末尾にある null バイトを指すポインター) が渡された場合、元のコードは安全ではありません。これは、指してendいるバイトの前に 1 バイトに減少するためです。strただし、文字列の先頭の 1 バイト前のアドレスが有効であるという保証はありません。文字列がメモリ ページの最初のバイトを指している可能性があり、前のページはマップされていないため、クラッシュやその他の問題が発生します。

strlen()文字列の長さを決定するために使用することをお勧めします。

void reverse(char *str)
{ 
    if (str != 0 && *str != '\0') // Non-null pointer; non-empty string
    {
        char *end = str + strlen(str) - 1; 

        while (str < end)
        {
            char tmp = *str; 
            *str++ = *end; 
            *end-- = tmp;
        } 
    }
}
于 2013-11-08T06:40:51.200 に答える