我是C语言编程的新手,我正在尝试创建一个程序,当用户输入他们的名字时,他们会被告知他们的性取向是随机的。然而,gcc是错误的,因为我认为我错过了一个;第17行是:if(strcmp(x,arrayNames [i] == 0));.我对strcmp()不太熟悉;但是我在K& R中读到它,只是无法理解它。以下是整个代码:
int main()
{
char *arrayNames[3]={"Jim", "Bob", "Dave"};
char *arrayOrient[3]={"straight", "gay", "bi"};
char x[100];
srand(time(NULL));
int size;
size = sizeof(arrayNames)/sizeof(arrayNames[0]);
int namesRand = rand() % size;
printf("Please enter your name: ");
scanf("%s", &x[0]);
int i;
for(i = 0; i < size; i++)
{
if(strcmp(x, arrayNames[i] == 0));
{
printf("Hello %s, your orientation is: %s", x, arrayOrient[namesRand]);
break;
}
else
{
printf("Invalid name!");
}
}
return 0;
}
使用strcmp()时的任何提示;将受到欢迎。
答案 0 :(得分:5)
我认为您需要删除分号。在if语句中不需要分号。
答案 1 :(得分:2)
您遇到语法错误。以下是应该的行:
if(strcmp(x, arrayNames[i]) == 0)
在“arrayNames[i]
”之后看到你需要的额外“)”吗? Strcmp compares two arguments如果两个字符串相同则返回“0”。
在“if”行的末尾删除额外的“);
”(父母和不必要的分号)。
答案 2 :(得分:0)
您的代码未编译的原因是这是一个完整的声明
if(strcmp(x, arrayNames[i] == 0))
; // If the strings are the same, do an empty expression.
显然声明应该是:
if(0 == strcmp(x, arrayNames[i]))
现在我们有一个没有if的else代码块。所以编译器抱怨。
{
} else // This else doesn't match the if, the if is a single-line statement.
试试这个:
if(0 == (strcmp(x, arrayNames[i])))
{
printf("Hello %s, your orientation is: %s", x, arrayOrient[namesRand]);
break;
}
else {
printf("Invalid name!");
}
}
答案 3 :(得分:0)
当您在if
语句后面加上分号时,如下所示:
(我没有像其他人那样提到错误的支架,我只是想澄清使用分号)
if(strcmp(x, arrayNames[i] == 0));
{
printf("Hello %s, your orientation is: %s", x, arrayOrient[namesRand]);
break;
}
else {
printf("Invalid name!");
}
}
标准说如果你没有为跳转语句添加braccets(作为循环或if语句) ,那么范围只是下一个表达式。
所以会发生什么:if
语句引用分号;
是什么意思,如果语句为真,则不会执行任何操作。由于没有与分号关联的表达式,因此该语句已被调用,并且在任何情况下都执行包含范围,不包含if
语句。
答案 4 :(得分:0)
Zaibis,Dauterman和Hot Licks是正确的。加: 1.我还在printf的末尾添加了换行符,&#34; \ n &#34;。 2.此外,这个宏将使你的生活更轻松:
#define strEQ(a,b) (0 == strcmp((a),(b)))
...
if(strEQ(x, arrayNames[i]) {
printf("Hello %s, your orientation is: %s\n", x, arrayOrient[namesRand]);
break;
} else {
printf("Invalid name!\n");
}
这是一个非常奇怪的程序,让用户猜出一个名字但不选择他们的性取向!他们怎么知道这三个名字中的哪一个是可以接受的呢?
此外,您还有潜在的错误:
arrayOrient [namesRand]
因为使用另一个数组arrayNames的长度而不是arrayOrient的长度来选择数字namesRand。