以下节目来自Gayle Laakmann McDowell撰写的“Cracking the coding interview”一书。
原始代码用C语言编写。
以下是原始代码:
void reverse(char *str) {
char * end = str;
char tmp;
if (str) {
while (*end) {
++end;
}
--end;
while (str < end) {
tmp = *str;
*str++ = *end;
*end-- = tmp;
}
}
}
我正在尝试用C#转换它。在通过Google进行研究并使用代码后,以下是我所拥有的。我是初学者,真的很困难。我没有得到我期待的价值。有人能告诉我我做错了吗?
class Program
{
unsafe void reverse(char *str)
{
char* end = str;
char tmp;
if (str) // Cannot implicitly convert type 'char*' to 'bool'
{
while(*end) // Cannot implicitly convert type 'char*' to 'bool'
{
++end;
}
--end;
while(str < end)
{
tmp = *str;
*str += *end;
*end -= tmp;
}
}
}
public static void Main(string[] args)
{
}
}
答案 0 :(得分:0)
C#与C不同,因为你不能将整数值用作隐式bool。您需要手动转换它。一个例子:
if (str != 0)
while (*end != 0)
警告:如果您要从C迁移,有一些事情可以让您在这样的程序中绊倒。主要的一点是char
是2个字节。字符串和字符是UTF-16编码的。 char
的C#等效值为byte
。当然,您应该使用string
而不是C字符串。
另一件事:如果您通过将普通char*
转换为string
来获得char*
,请忘记整个代码。这不是C.字符串不是以空值终止的。
除非这是作业,否则你宁愿做这样的事情:
string foo = "Hello, World!";
string bar = foo.Reverse(); // bar now holds "!dlroW ,olleH";
答案 1 :(得分:0)
尝试更清楚地了解您在条件中检查的内容: if(str!= null) while(* end!='\ 0')
您可能还需要注意该字符交换代码:看起来您在那里有+/-。如果那应该更新你的指针位置,我建议做那些单独的操作。
答案 2 :(得分:0)
我真的不记得这是否曾在C#中发挥作用,但我确信它现在不行。
首先回答你的问题。指针和布尔之间没有自动转换。你需要写
if(str != null)
其次,你不能将char转换为bool。此外,C#字符串没有终止字符,因此您甚至无法实现此功能。通常,你会写:
while(*end != '\0') // not correct, for illustration only
但是没有'\ 0'字符或任何其他magic-termination-char。因此,您需要获取一个int参数。
回到大局,这类代码似乎是开始学习C#的非常不合适的地方。它的级别太低,很少有C#程序员每天处理指针,字符和不安全的上下文。
...如果您必须知道如何修复当前代码,这是一个有效的程序:
unsafe public static void Main(string[] args)
{
var str = "Hello, World";
fixed(char* chr = str){
reverse(chr, str.Length);
}
}
unsafe void reverse(char *str, int length)
{
char* end = str;
char tmp;
if (str != null) //Cannot implicitly convert type 'char*' to 'bool'
{
for(int i = 0; i < length; ++i) //Cannot implicitly convert type 'char*' to 'bool'
{
++end;
}
--end;
while(str<end)
{
tmp = *str;
*str = *end;
*end = tmp;
--end;
++str;
}
}
}
编辑:删除了几个.Dump()调用,就像我在LINQPad中尝试一样:)
答案 3 :(得分:0)
正如您所发现的,如果您使用unsafe
关键字,则可以在C#中使用指针。但是,只有在真正需要的时候以及当你真正知道自己在做什么时,才应该这样做。如果你刚开始使用该语言,你肯定不应该使用指针。
现在,对于您的实际问题:您将获得一串字符,并且您想要反转它。 C#中的字符串表示为string
类。并且string
是不可变的,因此您无法修改它。但是您可以在string
和一组字符(char[]
)之间进行转换,您可以对其进行修改。您可以使用the static method Array.Reverse()
反转数组。因此,编写方法的一种方法是:
string Reverse(string str)
{
if (str == null)
return null;
char[] array = str.ToCharArray(); // convert the string to array
Array.Reverse(array); // reverse the array
string result = new string(array); // create a new string out of the array
return result; // and return it
}
如果您想编写实际执行倒车的代码,您也可以这样做(作为练习,我不会在生产代码中执行此操作):
string Reverse(string str)
{
if (str == null)
return null;
char[] array = str.ToCharArray();
// use indexes instead of pointers
int start = 0;
int end = array.Length - 1;
while (start < end)
{
char tmp = array[start];
array[start] = array[end];
array[end] = tmp;
start++;
end--;
}
return new string(array);
}