2013-08-25 65 views
1

我試圖在Visual Studio 2008年。但在運行時程序在reverseString.exe拋出一個錯誤如何使用C反轉字符串?

未處理的異常在0x002e1480運行下面的代碼:0000005: 訪問衝突寫入位置0x002e573c。

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

     while (str < end) 
     { 
     tmp = *str; 
     *str++ = *end; // Error Here 
     *end-- = tmp; 
     } 
    } 
} 

預先感謝您的幫助很大。

+3

你怎麼稱呼反向? str是如何定義的?也許修改字符串文字?否則它工作正常:http://ideone.com/zC0Iip – billz

+2

這聽起來似乎是合理的,上述函數調用與字符串文字將失敗! –

+0

@EdS。我認爲OP使用C++,他不能使用'std'庫。 – Caesar

回答

0

我能夠使用你的反向方法沒有問題,見下文。這個問題必須在您如何使用您傳遞中的char *。

int main() 
{ 
    char str[] = "Hello World!"; 

    reverse(str); 

    cout << str << endl; 

    return 0; 
} 

下面是輸出

!dlroW olleH 
+0

你是對的,我是直接將字符串傳遞給函數調用..非常感謝您的幫助 – Ullan

2

是微不足道的扭轉一個字符串:

if (str) { 
    std::reverse(str, str + strlen(str)); 
} 

然而,這種逆轉工作的前提是str指向一個可寫的字符串,即它被聲明爲char*,是從初始化一個字符串文字!雖然字符串文字可以用來初始化對象,但它們不一定指向可寫內存(並且在許多當代系統中它們不指向可寫內存)。

如果你想知道一個天真的實施std::reverse()怎麼可能是這樣的:

template <typename BiDirIt> 
void reverse(BiDirIt begin, BiDirIt end) { 
    for (; begin != end && begin != --end; ++begin) { 
     swap(*begin, *end); 
    } 
} 
+0

Thanks Dietmar Kuhl,但我試圖扭轉字符串,而不使用任何內置方法.. – Ullan

+0

'std :: reverse()'不是「內置的」!它只是一個函數模板。 –

+0

if(str){//如果* str包含可寫內存,則此行不測試。 – dcaswell

1
std::reverse(str, str + std::char_traits<char>::length(str)); 

請注意,倒車字符串會造成斷文字許多語言和編碼。

+0

只是想知道,使用'strlen'的優勢嗎?當我涉及到'std :: char_traits'時,我完全沒有經驗和不知道。 – chris

+0

@chris:不是,我可以剛剛說'strrev'。我只是展示了「C++」的做法,不使用任何C函數。 :) – Mehrdad

+0

啊,我明白了。那麼,我至少必須爲該筆記+1。我記得看到另一個SO問題,至少有一個答案詳細說明了這個問題並加以解決。 – chris

1

這裏是如何從頭開始做

#include <iostream> 

void reverse(char* input) 
{ 
    int size = strlen(input); 
    int half = size/2; 

    for(int i = 0; i < half; ++i) 
    { 
     char temp = input[size - i - 1]; 
     input[size - i - 1] = input[i]; 
     input[i] = temp; 
    } 
} 

int main() 
{ 
    char word[] = "hello"; 
    reverse(word); 
    std::cout << word; 
} 
0

我認爲你這樣稱呼它

char* mystr = "Hello"; 
reverse(mystr); 

對嗎?但是你不能這樣做,因爲reverse會修改導致訪問衝突的字符串(請參閱here)。如其他人建議的那樣使用

char mystr[] = "Hello"; 
reverse(mystr) 

這就是所謂的使用std :: reverse如其他人所建議的,這是一個更好的解決方案。

+0

你是對的...這是問題 – Ullan

0

另一種方法,如果你不喜歡/想要迭代器或反向函數。

string revStr(string str){ 
     if (str.length() <= 1) { 
      return str; 
     }else{ 
      return revStr(str.substr(1,str.length()-1)) + str.at(0); 
     } 
    } 
+0

嗯...當Knuth提出了關於不成熟優化的着名評論,我不認爲他有這種公然無視計算機時間的念頭。 –

+0

@BenjaminLindley這不正確?我錯過了什麼? – P0W

+0

這沒有錯。它只是做了很多額外的分配(取決於字符串的長度),這個過程可以很容易地完成。 –