';C型';Python中的字符串

';C型';Python中的字符串,python,string,null,Python,String,Null,一个非常流行的问题是如何反转C样式的字符串。定义的C样式字符串是以null('\0')结尾的字符串。使用C(或者可能是C++),可以使用指针来操作字符串,以就地反转其内容 如果有人问这样一个问题,“如何在Python中反转C样式的字符串?”,可能的答案是什么 谢谢Python不使用C风格的字符串;Python字符串可以包含嵌入式NUL,因此不使用C样式的字符串,而是使用显式长度 >>> 'abc\0def'[::-1] 'fed\x00cba' Python不使用C风格的字符

一个非常流行的问题是如何反转C样式的字符串。定义的C样式字符串是以null('\0')结尾的字符串。使用C(或者可能是C++),可以使用指针来操作字符串,以就地反转其内容

如果有人问这样一个问题,“如何在Python中反转C样式的字符串?”,可能的答案是什么


谢谢

Python不使用C风格的字符串;Python字符串可以包含嵌入式NUL,因此不使用C样式的字符串,而是使用显式长度

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

Python不使用C风格的字符串;Python字符串可以包含嵌入式NUL,因此不使用C样式的字符串,而是使用显式长度

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

由于C没有字符串类型,所以它将字符串表示为指向
char
的指针,其中最后一个字节(假定为ASCII,而不是宽字符)是
\0
。这是一种表现。顺便说一下,这个默认实现有一个缺陷,
\0
不能是这样一个字符串的一部分。如果需要,则需要不同的表示(例如将字符串表示为指针+长度整数)


Python,OTOH有一个字符串类型,用户不知道该类型是如何表示的。因此,“C样式字符串”在Python中是一个毫无意义的概念。

因为C没有字符串类型,所以它将字符串表示为指向
字符的指针,其中最后一个字节(假定ASCII,而不是宽字符)是
\0
。这是一种表现。顺便说一下,这个默认实现有一个缺陷,
\0
不能是这样一个字符串的一部分。如果需要,则需要不同的表示(例如将字符串表示为指针+长度整数)

Python,OTOH有一个字符串类型,用户不知道该类型是如何表示的。因此,“C样式字符串”在Python中是一个毫无意义的概念。

Python字符串是。你可以用一个字符表来模拟一个C风格的字符串,但我不明白你为什么要这么麻烦

但是如果您确实有一个C样式的“字符串”(即字符表),那么您需要做的就是将s[i]与s[len(s)-i-1]交换:

(如果a是您的C样式字符串)

请注意,您不需要临时变量(假定您在C中也不需要临时变量,考虑到如何使用空字符作为临时空间)。

Python字符串是可用的。你可以用一个字符表来模拟一个C风格的字符串,但我不明白你为什么要这么麻烦

但是如果您确实有一个C样式的“字符串”(即字符表),那么您需要做的就是将s[i]与s[len(s)-i-1]交换:

(如果a是您的C样式字符串)

请注意,您不需要临时变量(考虑到如何使用空字符作为临时空间,在C中也不需要临时变量)。

如果需要“在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中不可能出现“原地反转字符串”的概念

希望这有帮助。如果有,请投票并接受答案。谢谢。:-)

如果需要“在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中不可能出现“原地反转字符串”的概念


希望这有帮助。如果有,请投票并接受答案。谢谢。:-)

你如何定义Python中的“C风格字符串”?带有尾随
\x00
的Python字符串?或者来自C扩展的东西?你对Python中的“C样式字符串”有什么定义?带有尾随
\x00
的Python字符串?或者来自C扩展的东西?谢谢。你能在这里解释一下你的片段吗?“\0”是您所指的嵌入式NUL吗?它使用扩展切片从源序列的开始返回序列,但顺序相反。字符串中的
\0
实际上是一个嵌入式NUL
'abc\0def'
不是c样式的字符串,也不是
'fed\x00cba'
@martineau:同样,Python是这样的。不有C型字符串。@martineau:你认为什么是C型字符串?谢谢。你能在这里解释一下你的片段吗?“\0”是您所指的嵌入式NUL吗?它使用扩展切片从源序列的开始返回序列,但顺序相反。字符串中的
\0
实际上是一个嵌入式NUL
'abc\0def'
不是c样式的字符串,也不是
'fed\x00cba'
@martineau:同样,Python是这样的。不有C型字符串。@马蒂诺:你认为什么是C型字符串?@sc\u-ray回答了你的问题吗?@sc\u-ray回答了你的问题吗?@delnan:如果答案的代码正确缩进(显示的代码在语法上不正确,Python)会更好一些。如果添加一些可选的空格,可能会变得更加合理。这就是说,除非你理解所涉及的算法,否则可能仍然很难理解编写的代码在做什么或如何清楚地完成它的工作和任务。@delnan:如果答案的代码有b