2013-04-12 39 views
1
#include <iostream> 
#include <string> 

void reverse(char*); 

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

int main { 
    char * string; 
    string = "Hello"; 
    reverse(string); 
    std::cout << string; 
    return 0; 
} 

你好。我試圖測試這個簡單的函數,並得到錯誤「期望在'char'之前的主要表達式在我聲明變量字符串作爲字符指針的行。請原諒我是新手,可能會犯更多錯誤。謝謝你的幫助!期待'char'之前的主表達式

+5

您還沒有列入main'的'定義括號和參數。 – Jon

+0

你也有未定義的行爲:雖然C允許將一個文字字符串分配給一個'char *' - 你不能修改它。您需要分配一個緩衝區(在堆棧或免費存儲區)並將文字複製到它,然後才能安全地修改它。在某些體系結構中,由於文字通常位於只讀存儲器中,因此可能會遇到訪問衝突。 –

回答

1

你忘了參數列表爲主體,它有兩個允許值:

int main(void) // Option 1 
{ 
    // The 'void' is optional; in C++, it's equivalent to "int main()", but there 
    // is a difference in plain C 
    ... 
} 

// OR 

int main(int argc, char *argv[]) // Option 2 
{ 
    // The names of the variables argc and argv can of course be changed; argv 
    // can also be declared as char** 
    ... 
} 

你也有一個語義問題,這是一個字符串文字像像"Hello"是不可修改的。從const char[]char*有一個棄用的轉換,但應該避免這種轉換,如果啓用了警告,則編譯器應該警告您。如果您嘗試運行代碼,則會出現分段錯誤或訪問衝突。

爲了解決這個問題,你應該聲明你的string變量作爲修改的陣列,而不是一個指針:

char string[] = "Hello"; 
+0

請注意,在第一個版本中,不需要「void」。 –

+0

謝謝,先生! – Thalatta

相關問題