2017-11-29 5 views
-1

Visual Studioでは、rstr()(リバース文字列に)関数が "olla¥0"を返しますが、コンソールディスプレイには判読不可能な文字記号が表示されていることがはっきりとわかります。また、何らかの理由により、printf()を呼び出した後に、変数reverseがデバッグモードで変数を見ている間も、読み取り不可能な文字値に変換されます。誰も正確にrstr()によって返された文字列を表示する方法を知っていますか?printf()の呼び出しがコンソールに正しい文字を表示できないのはなぜですか?

#include "stdio.h" 

const char* rstr(const char* message) { 

    const int msg_size = sizeof(message)/sizeof(message[0]); 
    char r[msg_size + 1]; 

    for (int i = 0; i < msg_size; ++i) { 
     r[i] = message[msg_size - i - 1]; 
     if (i == (msg_size - 1)) 
      r[msg_size] = '\0'; 
    } 

    return r; 
} 

int main() 
{ 
    const char* reversed = rstr("allo"); 
    printf("Reversed string is: %s\n", reversed); 

    getchar(); 
    return 0; 
} 
+5

「r」はローカルスコープです。その関数から戻ると、スコープは失われ、データはゴミです。ヒープ上にスペースを割り当てるには 'malloc'を使います。 –

答えて

2
const int msg_size = sizeof(message)/sizeof(message[0]); 

ここにすべて間違っています。

メッセージはchar*なので、sizeof(message)はcharへのポインタのサイズになります。

message[0]がcharであるため、定義上、sizeof(message[0])が1つです。したがって、msg_sizeはcharへのポインタのサイズになります。

文字列の長さをrstr()関数に渡す必要があります。

関連する問題