无法将类型'char *'隐式转换为'bool'

时间:2012-04-06 11:25:21

标签: c#

以下节目来自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)
    {
    }
}

4 个答案:

答案 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);
}