【问题标题】:Checking equality of a string in C and printing an answer [duplicate]检查C中字符串的相等性并打印答案[重复]
【发布时间】:2014-01-27 22:59:25
【问题描述】:

我已经编写了一些简单的代码作为 SSCCE,我正在尝试检查输入的字符串是否等于我在 char 指针数组中定义的字符串,所以它应该指向该字符串并给我一个结果.我没有收到任何警告或错误,但我没有得到任何结果(“真”或“假”)

scanf 是否正在扫描其他内容?终止符号还是什么?我只是无法让它打印出真假

代码:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>


#define LENGTH 20

//typedef char boolean;

int main(void)
{
    const char *temp[1];
    temp[0] = "true\0";
    temp[1] = "false\0";

    char var[LENGTH];

    printf("Enter either true or false.\n");
    scanf("%s", var);


    if(var == temp[0]) //compare contents of array
    {
        printf("\ntrue\n");
    }
    else if(var == temp[1]) //compare contents of array
    {
        printf("\nfalse\n");
    }
}

【问题讨论】:

  • 您不会将 C 字符串与 == 进行比较,而是将 strcmp 进行比较...
  • 是的,我想了很多,但没有办法与 == 进行比较吗?我可能在这里的另一个答案中被误导了
  • 不,没有。还有其他错误,但我没有解决这些错误,因为您的问题是关于字符串的比较。
  • @user2387699 不,没有。也许他们将 C 和 C++ 混淆了,因为标准字符串类有一个直观的 == 运算符。
  • @H2CO3 放置 2 个空终止符,以确保字符串真正终止:P

标签: c string string-comparison


【解决方案1】:
const char *temp[1];

这定义了tmp一个可以存储1个char*元素的数组。

temp[0] = "true\0";

分配给第一个元素。没关系。

temp[1] = "false\0";

将分配给第二个元素,但temp 只能存储一个。 C 不会为您检查数组边界。 也不是说您不必在字符串文字中明确指定终止 '\0',所以只需 "true""false" 就足够了。

if(var == temp[0])

这仅比较指针值(“存储字符串的位置”),而不是内容。您需要 strcmp() 函数(请仔细阅读,相等字符串的返回值可能不是您所期望的)。

【讨论】:

    【解决方案2】:

    使用strcmp 比较字符串:

    #include <stdio.h>
    
    int main(void)
    {
        const int LENGTH = 20;
        char str[LENGTH];
    
        printf("Type \"true\" or \"false\:\n");
        
        if (scanf("%19s", str) != 1) {
            printf("scanf failed.");
            return -1;
        }
    
        if(strcmp(str, "true") == 0) {
            printf("\"true\" has been typed.\n");
        }
        else if(strcmp(str, "false") == 0) {
            printf("\"false\" has been typed.\n");
        }
    
        return 0;
    }
    

    还要注意:

    • 字符串文字自动包含空终止字符("true",而不是"true\0"
    • const int LENGTH#define LENGTH 好,因为它带有类型安全性
    • "%19s" 确保在 str 中存储的字符不超过 19 个(+ \0
    • typedef char boolean; 不是个好主意
    • 不太可能,但仍然:scanf 不一定要成功
    • 并且 中没有#include &lt;iostream&gt; :)

    【讨论】:

    • 这看起来比我做的更好更整洁,谢谢
    • @user2387699:不客气 :)
    【解决方案3】:

    == 检查是否相等。让我们看看你在比较什么。

    • 变量var被声明为一个字符数组,所以表达式var实际上等价于&amp;var[0]var数组中第一个字符的地址)。
    • 同样,temp[0] 等价于&amp;temp[0][0]temp[0] 数组中第一个字符的地址)。

    这些地址明显不同(否则写入var 也会自动写入temp[0]),因此== 将始终为您的情况返回0。

    strcmp,另一方面,不检查其输入是否相等,而是检查其输入指向的数组的逐字符相等(即,它比较它们的成员,而不是它们的地址)因此您可以将它用于 C 中的字符串。值得注意的是,如果字符串 相等,strcmp 将返回 0(假)。

    【讨论】:

    • 感谢您提供此信息,我已经可以使用 strcmp 了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多