检查C中字符串的相等性并打印答案

时间:2014-01-27 22:59:26

标签: c string string-comparison

我写了一些简单的代码作为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");
    }
}

3 个答案:

答案 0 :(得分:2)

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()函数(并仔细阅读,相等字符串的返回值可能与您预期的不同)。

答案 1 :(得分:1)

使用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"确保\0
  • 中不会存储超过19个字符(+ str
  • typedef char boolean;不是个好主意
  • 不太可能,但仍然:scanf不必成功
  • 中没有#include <iostream>:)

答案 2 :(得分:0)

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

  • 变量var被声明为字符数组,因此表达式var实际上等同于&var[0] (第一个字符的地址) var数组)。
  • 同样, temp[0]相当于&temp[0][0] temp[0]数组中第一个字符的地址)。

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

另一方面,

strcmp不检查其输入是否相等,而是检查其输入指向的数组的逐字符相等性(也就是说,它比较它们的成员,而不是它们的成员因此,您可以将其用于C中的字符串。值得注意的是,如果字符串 相等,strcmp将返回0(false)。