【问题标题】:Checking char with if [duplicate]用 if 检查 char [重复]
【发布时间】:2012-04-15 19:52:07
【问题描述】:

我真的不知道为什么,但这似乎不起作用。对我来说似乎完全有效:

gchar *text = gtk_entry_get_text(entry);
if(text == "hello") { 
    //do sth
}
else {
    //do sth else
}

即使我输入 hello,除了调用 else { } 中的代码外,什么也没有发生。有什么问题?

【问题讨论】:

  • 当您使用GtkGlib 时,您可以使用g_Strcmp0,它比strcmp 更好地处理NULL
  • 很有趣。我会记住这一点的。

标签: c gtk gtkentry


【解决方案1】:

您需要使用strcmp 比较字符串:

if(strcmp(text, "hello") == 0) { 
    //do sth
}
else {
    //do sth else
}

你正在做的是比较两个指针。 Read more.

【讨论】:

    【解决方案2】:

    在 C 中,字符串字面量是在许多情况下成为指针的数组。当您使用== 时,您要比较的是字符串的地址(或者更确切地说,每个字符串的第一个字符的地址),而不是您所期望的字符串的内容。例如:

    if (text == "hello")
    

    有点像在做:

    if (0x800050a0 == 0x80001000)
    

    text 不太可能指向存储"hello" 字符的同一位置。

    要在 C 中比较字符串,您应该使用strcmp,它会根据字符串相互比较的方式返回一个整数。如果字符串相等,则该函数返回 0。如果第一个字符串按字典顺序小于第二个字符串,则该函数返回 -1,否则该函数返回 1。

    【讨论】:

    • 很好的答案,谢谢大家。
    【解决方案3】:

    您的程序比较字符串text"hello" 的指针。它不会逐个字符地比较字符串。

    (其他回答者演示了逐字符比较的方法)

    【讨论】:

      【解决方案4】:

      您的代码比较指针,它们显然不相等。您想比较字符串,因此您可能需要执行以下操作:

      if (strcmp(text, "hello") == 0) {
          // Do something
      } else {
          // Do something else
      }
      

      【讨论】:

        【解决方案5】:

        C字符串不是对象,不能和==比较;使用strcmp()

        【讨论】:

          【解决方案6】:

          您不是在比较内容,而是在比较地址。

          要比较数据,您应该使用 strcmp-ish 函数。

          【讨论】:

            【解决方案7】:

            比较

            text == "hello"
            

            您正在将存储文本的内存地址与存储常量字符串文字“hello”的地址进行比较。这是因为 C 字符串实际上是一个指向字符数组的 指针。然后它被解释为一个字符序列,直到到达空终止符。

            包含库

            include <string.h>;
            

            做比较

            !strcmp(text, "hello");
            

            strcmp() 函数接受两个字符串,如果它们相等则返回 0,否则返回非零。如果它不为零,则负/正值确定哪个在字典上更小(第一/第二),绝对值确定它们不同的第一个字符。

            【讨论】:

            • 是的,我现在明白了。谢谢你的回答
            【解决方案8】:

            GLib(#include &lt;glib.h&gt;,你应该拥有它,因为你拥有 GTK)为此目的有一个 g_ascii_strcmp() 函数。如果您的文本不是 ascii(这很可能是因为它是用户输入,几乎可以包含任何内容),您应该与 g_utf8_collate() 进行比较。

            【讨论】:

              猜你喜欢
              • 2017-12-12
              • 2021-06-08
              • 2012-10-12
              • 2018-09-09
              • 1970-01-01
              • 2018-04-19
              • 2014-05-26
              • 2022-01-19
              • 2011-01-16
              相关资源
              最近更新 更多