【问题标题】:Booleans in C languageC语言中的布尔值
【发布时间】:2020-05-01 03:24:41
【问题描述】:
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdbool.h>



_Bool check_domain(char *domain) {
    int str_count = 0, x = strlen(domain), y = 0;
    if (domain[x-1] == '.' || domain[0] == '.'){
        return false; //if there is a period at start or end
    }
    else{
        while (domain[y]){
            if (str_count==2){
                return false; //if 2 consecutive periods
            }
            if (domain[y] == 46 || 65<=domain[y]<=90 || 97<=domain[y]<=122){ //if character is period or alphanumeric
                if (domain[y] == '.'){
                    str_count += 1;
                }
                else{
                    str_count = 0;
                }
            }
            else{ // if character is non period non alphanumeric
                return false;
            }
            y += 1;
        }
    }
    return true;
}

int main(void){
    char domain[] = "nus@edu.sg";
    printf("%d",check_domain(domain));
}

编辑: 感谢您的回复,现在对这个主题有更多的了解。 除了在结尾或开头没有句点,也没有两个连续的句点之外,字符串内不应有非句点、非字母数字字符。 由于我无法弄清楚的原因,对于字符串中存在非句点、非字母数字字符的情况,此代码无法返回 false。

【问题讨论】:

  • 你遇到了什么错误?
  • 您至少缺少 3 个必需的 #include 指令:&lt;stdio.h&gt;(对于 printf)、&lt;string.h&gt;(对于 strlen)和 &lt;stdbool.h&gt;(对于 falsetrue)。 void main() 应该是 int main(void)。这些不是唯一的错误。始终包含您的整个程序(请参阅minimal reproducible example)以及您在编译时遇到的实际复制粘贴错误。
  • 你有while (domain[x]) {},其中xdomain的字符串长度。这意味着domain[x] 将始终是字符串末尾的空终止符,因此while 循环将永远不会运行。看起来您应该使用 for (x = 0; domain[x]; x++) {} 而不是 while 循环
  • 不要为变量使用无意义的名称。 i 传统上用作索引,而在这里您使用它来保存您找到的周期数。如果您使用更好的名称,例如periods_found,那么代码会更清晰。同样,可能在您使用 x 的地方使用 i
  • 大家好,感谢您的帮助。我已经实施了您的建议,但仍然存在问题。你能告诉我哪里出错了吗?

标签: c boolean


【解决方案1】:

从这里开始

if (domain[y] == 46 || 65<=domain[y]<=90 || 97<=domain[y]<=122){
                       ^^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^^^^^^^

C 不能以你期望的方式处理像 n &lt;= X &lt;= m 这样的语句。

C 将其视为:

(65<=domain[y]) <= 90
^^^^^^^^^^^^^^^    ^^
   bool         <= number

所以首先 C 会从 65&lt;=domain[y] 计算一个 bool 结果,然后它将该 bool 与一个数字进行比较。 bool 被转换为 0 或 1,因此当与 90 比较时,结果始终为 true。

如果您检查了编译器警告,您会看到如下内容:

main.cpp:18:49: warning: comparison of constant '90' with boolean expression is always true [-Wbool-compare]

18 |             if (domain[y] == 46 || 65<=domain[y]<=90 || 97<=domain[y]<=122){
   |                                                 ^~

它告诉你出了点问题。

你需要写

if (domain[y] == 46 || (65<=domain[y] && domain[y]<=90) || (97<=domain[y] && domain[y]<=122)){

顺便说一句:

不要使用 65、90 等幻数。改用字符。喜欢:

(65<=domain[y] && domain[y]<=90) --> ('A' <= domain[y] && domain[y] <= 'Z')

它使代码更容易理解。

进一步 - 考虑使用函数 isalpha(domain[y]) 进行此类检查。

最后 - 您的文本(和函数名称)表示您要检查域名。但是,您的输入更像是一个电子邮件地址。

【讨论】:

  • 更重要的是,使用isalpha(domain[y]) 来测试字母(字母字符)——提供&lt;ctype.h&gt; 标头以避免使用数字。
  • @JonathanLeffler 同意 - 我只是想向 OP 表明这是错误的。我已经添加了一些关于它的评论。
猜你喜欢
  • 2013-03-23
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 2021-12-19
相关资源
最近更新 更多