1

我是 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() 时的任何提示;会受到欢迎。

4

5 回答 5

5

我认为您需要删除分号。if then 语句中不需要分号。

于 2013-08-25T00:26:18.627 回答
2

您有语法错误。这条线应该是这样的:

if(strcmp(x, arrayNames[i]) == 0)

看到“”之后需要的额外的“)”了arrayNames[i]吗? strcmp 比较两个参数,如果两个字符串相同,则返回“0”。

删除);“if”行末尾多余的“”(父母和不必要的分号)。

于 2013-08-25T00:28:45.557 回答
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!");
    }
}
于 2013-08-25T00:27:28.350 回答
0

if在这种情况下,当您在语句后面加上分号时:

(我并没有像其他人那样指代错误放置的大括号,我只是想澄清分号的使用)

if(strcmp(x, arrayNames[i] == 0));
{
    printf("Hello %s, your orientation is: %s", x, arrayOrient[namesRand]);
    break;
        }
    else {
        printf("Invalid name!");
    }
}

该标准规定,如果您不为跳转语句(作为循环或 if 语句)放置大括号,那么范围就是下一个表达式。

那么发生的事情是:if语句引用分号;是什么意思,如果语句为真,则不会执行任何操作。由于没有与分号关联的表达式,因此该语句已被调用,并且在任何情况下都执行包含的范围,不依赖该if语句。

于 2013-08-25T00:32:05.707 回答
0

Zaibis 和 Dauterman 和 Hot Licks 是正确的。加: 1. 我还在 printf 的末尾添加了换行符,即“ \n ”。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。

于 2013-08-25T00:59:14.367 回答