所以我正在检查NULL指针/空字符串,如果找到则返回0。但是,我似乎在其中一个编译器中遇到Segmentation Fault
错误。如果有人能帮助我找出可能导致它的原因。显然,当empty strings
和null pointers
用作输入时,会出现错误。但是,这个错误不会出现在我正在使用的编译器中,而是出现在另一个编译器中(我正在评估的编译器)。
rpsls.c
#include <string.h>
int rpsls(const char *player1, const char *player2)
{
if (*player1 == '\0' || *player2 == '\0' || player1 == NULL || player2 == NULL || strcmp(player1, player2) == 0)
return 0;
char *r = "rock";
char *p = "paper";
char *si = "scissors";
char *l = "lizard";
char *s = "Spock";
if (!strcmp(player1, r) && !strcmp(player2, si))
return 1;
else if (!strcmp(player1, p) && !strcmp(player2, r))
return 1;
else if (!strcmp(player1, si) && !strcmp(player2, p))
return 1;
else if (!strcmp(player1, l) && !strcmp(player2, s))
return 1;
else if (!strcmp(player1, s) && !strcmp(player2, si))
return 1;
else if (!strcmp(player1, r) && !strcmp(player2, l))
return 1;
else if (!strcmp(player1, p) && !strcmp(player2, s))
return 1;
else if (!strcmp(player1, si) && !strcmp(player2, l))
return 1;
else if (!strcmp(player1, l) && !strcmp(player2, p))
return 1;
else if (!strcmp(player1, s) && !strcmp(player2, r))
return 1;
if (!strcmp(player2, r) && !strcmp(player1, si))
return -1;
else if (!strcmp(player2, p) && !strcmp(player1, r))
return -1;
else if (!strcmp(player2, si) && !strcmp(player1, p))
return -1;
else if (!strcmp(player2, l) && !strcmp(player1, s))
return -1;
else if (!strcmp(player2, s) && !strcmp(player1, si))
return -1;
else if (!strcmp(player2, r) && !strcmp(player1, l))
return -1;
else if (!strcmp(player2, p) && !strcmp(player1, s))
return -1;
else if (!strcmp(player2, si) && !strcmp(player1, l))
return -1;
else if (!strcmp(player2, l) && !strcmp(player1, p))
return -1;
else if (!strcmp(player2, s) && !strcmp(player1, r))
return -1;
return 0;
}
main.c
#include <stdio.h>
int rpsls(const char *player1, const char *player2);
int main (void)
{
printf ("%d\n", rpsls("rock","paper"));
printf ("%d\n", rpsls("rock","rock"));
printf ("%d\n", rpsls("paper","rock"));
printf ("%d\n", rpsls("lizard",(char*)0));
printf ("%d\n", rpsls("",(char*)0));
return 0;
}
答案 0 :(得分:6)
使用逻辑OR运算符从左到右计算表达式,所以在
中if (*player1 == '\0' || *player2 == '\0' ||
player1 == NULL || player2 == NULL ||
strcmp(player1, player2) == 0)
在测试NULL
之前,您在*player1 == '\0'
中取消引用player1 == NULL
。
*player1==NULL
相当于player1[0]==NULL
。如果player1
指向您未分配的内存,则尝试读取此内存的效果未定义。此时任何事情都可能发生。在您的本地测试中,您报告这似乎有效(我对此持怀疑态度);在您老师的测试中,您的程序无权读取地址0
和段错误。
您需要重新排序表达式
if (player1 == NULL || *player1 == '\0' ||
player2 == NULL || *player2 == '\0' ||
strcmp(player1, player2) == 0)
答案 1 :(得分:3)
if (*player1 == '\0' || *player2 == '\0' || player1 == NULL || player2 == NULL || strcmp(player1, player2) == 0)
return 0;
在检查NULL之前,您正在取消引用指针。有点失败了NULL检查的目的。
先检查NULL,然后取消引用。