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