我为一个奇怪的骰子游戏写了一个程序,假定在IF-ELSE部分有错误的条件。我正在粘贴一个可以复制问题的工作代码片段。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int rollTotal = 11;
int rollTotal2 = 10;
char userGuess[5] = "l";
if ((userGuess == "h" && rollTotal2 > rollTotal) || (userGuess == "e" && rollTotal2 == rollTotal) || (userGuess == "l" && rollTotal2 < rollTotal))
{
printf("You win :D \n");
}
else
{
printf("You lose D: \n");
}
return 0;
}
预期输出:“你赢了:D”|实际输出:“你输了D:”
我认为这是条件问题。所以,我将条件更改为(userGuess == 'h' && rollTotal2 > rollTotal)
等等(我将双引号逗号更改为单个引号)。这给了我同样的输出和warning: comparison between pointer and integer
。这让我感到困惑SO Q&A,因为我不知道这些功能,所以我无法做任何事情。
这导致我进入我的程序的当前状态,这是上面粘贴的状态(我回复到双引号)。我仍然相信IF-ELSE的条件是错误的。它仍然与Warning: comparison with string literals results in unspecified behaviour
一起给我相同的错误输出。这引出了另一个fruitless endeavor。
这个错误可能是由于我对指针等知识缺乏而且很可能非常愚蠢。请帮帮我。
可能会有所帮助的一些信息 -
IDE:Code :: Blocks
编译器:GCC
操作系统:Linux
答案 0 :(得分:8)
userGuess == "h"
(和userGuess == "e"
)
使用运算符==
比较字符串文字,这不是C中的有效字符串比较 - 您应该使用标准库函数进行字符串比较strcmp
而不是 1 。
否则,将userGuess
设为单个char
变量而不是char数组,并使用单个字符(单引号)进行比较,例如
userGuess == 'h'
1
就目前而言,比较userGuess == "h"
会编译但是如果你打开gcc -Wall
编译器标志会给你一个警告,例如:
warning: comparison with string literal results in unspecified behavior [-Waddress]
这意味着(正如Jonathan Leffler在下面的评论中所提到的),你不是在比较字符串本身,而是比较两个指针(userGuess
和"l"
指向相同的位置) - 这是有效但通常毫无意义。
答案 1 :(得分:2)
请理解char数据类型的概念。如果您只想比较一个字符,请不要将变量声明为字符串并将其与字符进行比较。请在下面找到代码。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int rollTotal = 11;
int rollTotal2 = 10;
char userGuess = 'l';
if ((userGuess == 'h' && rollTotal2 > rollTotal) || (userGuess == 'e' && rollTotal2 == rollTotal) || (userGuess == 'l' && rollTotal2 < rollTotal))
{
printf("You win :D \n");
}
else
{
printf("You lose D: \n");
}
getchar();
return 0;
}
如果你想比较字符串,请使用strcmp()函数比较字符串并在代码中添加头文件#include。
答案 2 :(得分:0)
您正在将数组userGuess的地址与字符串的地址进行比较&#34; h&#34;和&#34; e&#34;。
对此的解释将使用
*userGuess == 'h'
Array的名称是此数组的地址,与指针相同。 &#39; H&#39;是一个文字字符然后是一个字符串。