如何在C语言中使用布尔函数来处理这段代码

4
这段代码有什么问题?
#include <stdio.h>

bool func(char *, int);

void main()
{
   char *a = "Interview";
   if(func(a, 9))
   {
      printf("True");
   }
   else
   {
      printf("False");
   }
}

bool func(char *s, int len)
{
   if(len < 2)
      return true;
   else
      return s[0] == s[len-1] && func(&s[1], len-2);
}

我相信这个函数总是返回TRUE。这是一个面试问题。但是,当我尝试编译它时,显示了六个错误...

7
你缺少了#include <stdbool.h>main函数的返回类型必须是int - Daniel Fischer
2
你可以使用int代替bool,1/0代替true/false。或者使用#define bool int,#define true 1,#define false 0。 - J X
1
语法错误:标识符'func'。 - Ravi
@JX 是的,我可以,但那是一道面试题,所以我不能对它进行任何更正。 - Ravi
3个回答

18
我猜它不知道什么是booltrue。在C中,bool不是一个原始数据类型。你需要额外的包含:
#include <stdbool.h>

你的问题的第二部分?它总是返回TRUE吗?
不是的:
当你进入函数时,你会跳过第一个返回,因为你的长度是9。所以只有在以下情况下,你才会返回true:
return s[0] == s[len-1] && func(&s[1], len-2)

没错。你可以跳过递归逻辑,因为它不会修改你的字符串。只需要看一下第一部分就行了:
s[0]     // This has to be 'I'
==       // We need so what we compare against has to be 'I' as well
s[len-1] // This will be 'w'

所以...这不会返回true...谁在乎递归部分的AND操作(&&)呢?我怀疑编译器甚至会将其优化掉,因为这里的一切都是硬编码的。

更正一下,bool不是一个原始数据类型,但它在C99及其后续版本中是标准的(因此称为stdbool)。 - Fingolfin
@зЁӢеәҸе‘ҳ们 - еҜ№зҡ„...жүҖд»Ҙs[len-1] && trueдјҡжҳҜtrueпјҢдҪҶй—®йўҳдёҚеңЁдәҺжӯӨ...дҪ иҝҳйңҖиҰҒж»Ўи¶іs[0] == s[len-1]жүҚиғҪдҪҝе…¶дёәзңҹгҖӮиҝҷжҳҜдёҚеҸҜиғҪеҸ‘з”ҹзҡ„гҖӮиҜ·жҹҘзңӢжҲ‘е…ідәҺйҖ»иҫ‘зҡ„её–еӯҗзҡ„зј–иҫ‘гҖӮ - Mike
@Mike 谢谢!!但是程序显示错误。fatal error C1083: Cannot open include file: 'stdbool.h': No such file or directory为什么会这样..?? - Ravi
+1并接受最佳解释。:) 但是,@Mike,出现错误。请帮忙。 - Ravi
@程序员们 - 这可能是一个完全不同的话题。你用的是Windows还是Linux?用的是什么IDE?等等。我建议你做一些搜索,如果找不到答案就开一个新话题。如果你正在使用Linux,请尝试从根目录下使用以下命令搜索stdbool.h文件:sudo find . -name "stdbool.h"。然后确保它被正确地包含在内,它应该在/usr/include目录下。 - Mike
显示剩余3条评论

5
你只需要包含正确的头文件即可。
#include <stdbool.h>

或者,您可以使用_Bool类型,它不需要任何包含。 bool只是此类型的别名。顺便提一下,请不要忘记在C99中编译。


-2

真和假被定义为1和0,所以你应该这样做:

#define true 1
#define false 0
int code() {
  //code
}

关于“真和假被定义为1和0”的问题:你有来源吗? - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接