2010-11-21 143 views
1

一個非常受歡迎的問題是如何反轉C風格的字符串。根據定義,C風格字符串是一個由null('\ 0')終止的字符串。使用C(或者C++),可以使用指針來操縱字符串以便在原地顛倒其內容。Python中的'C風格'字符串

如果有人問這個問題:「你如何在Python中反轉C風格的字符串?」,那麼可能的答案是什麼?

謝謝

+3

你對Python中「C風格字符串」的定義是什麼?一個尾隨'\ x00'的Python字符串?或者來自C擴展的東西? – 2010-11-21 15:09:59

回答

4

如果您需要「在Python中反轉C風格的字符串」,我認爲最終結果也必須是c風格的字符串。

這就是我如何理解這個問題,但是上面的回答做不是支持這個。

請參見下面的交互式會話:

>>> 
>>> original = "abc\0" 
>>> finish_correct = "cba\0" 
>>> original 
'abc\x00' 
>>> finish_correct 
'cba\x00' 
>>> 
>>> answer = original[:-1] # remove final null 
>>> answer = answer[::-1] # reverse string 
>>> # Extended slice syntax: [begin:end:step] 
>>> # So, [::-1] means take whole string, but in reverse. 
>>> answer 
'cba' 
>>> answer = answer + "\0" 
>>> answer 
'cba\x00' 
>>> answer == finish_correct 
True 

還要注意,Python中的字符串是不可改變的。這意味着他們永遠不能改變。您可以創建分配給相同變量名稱的新字符串,但給定字符串的內存映像永遠不會更改。因此,「在位反轉字符串」的概念不能在Python中發生。

希望這會有所幫助。如果是這樣,請投票並接受答案。謝謝。 :-)

+0

@sc_ray這是否回答你的問題? – nonot1 2010-11-22 04:34:02

+0

很好的回答。謝謝! – 2010-11-22 11:11:47

3

Python不使用C風格的字符串; Python字符串可以包含嵌入的NUL,因此不使用C風格的字符串,而是使用明確的長度。

>>> 'abc\0def'[::-1] 
'fed\x00cba' 
+0

謝謝。你能在這裏解釋你的片段嗎?您所指的嵌入式NUL是否是'\ 0'? – 2010-11-21 15:31:08

+0

它使用擴展切片從源序列的開始到結尾返回一個序列,但是順序相反。字符串中的'\ 0'確實是一個嵌入的NUL。 http://docs.python.org/release/2.3.5/whatsnew/section-slices.html – 2010-11-21 15:35:37

+0

''abc \ 0def''不是c風格的字符串,也不是'fed \ x00cba''。 – martineau 2010-11-21 17:15:05

3

因爲C沒有字符串類型,它代表字符串作爲指針char,其中最後一個字節(假設ASCII,不寬字符)是\0。這是表示。順便說一句,這個默認的實現有一個缺陷,即\0不能成爲這樣一個字符串的一部分。如果需要,則需要不同的表示形式(例如將字符串表示爲指針+長度整數)。

Python,OTOH有一個字符串類型,它對用戶來說是不透明的,這種類型如何表示。因此,「C風格的字符串」在Python中是一個沒有意義的概念。

1

python字符串是immutable。你可以模擬一個帶有字符表的c樣式字符串,但我不明白爲什麼你會打擾。但是如果你確實有一個c字符串(即字符表),那麼你需要做的就是用s [len(s)-i-1]交換s [i]:

for i in range(0,len(a)-2): 
a[i],a[len(a)-1-i]=a[len(a)-1-i],a[i] 

(如果是你的C風格的字符串)

注意你怎麼不需要一個臨時變量(當然你不需要一個是C或者,考慮瞭如何使用空字符作爲臨時空間)。

+2

Python的執行清晰的代碼太多了...... – delnan 2010-11-21 16:19:03

+0

@delnan:如果答案的代碼已被正確縮進(所顯示的代碼在語法上不正確的Python),會更好一些。如果添加了一些可選的空白,它可能變得更加明智了。也就是說,除非您瞭解所涉及的算法,否則可能仍然很難理解編寫代碼的代碼是如何工作並完成其任務的。 – martineau 2010-11-22 12:19:05