2010-11-21 40 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