【问题标题】:How to compare input with multiple string (an array of string) using strcmp()? [duplicate]如何使用 strcmp() 将输入与多个字符串(字符串数组)进行比较? [复制]
【发布时间】:2026-01-13 01:15:02
【问题描述】:

这是我目前的代码

#include <stdio.h>
#include <string.h>  

int main() {
    char size[10];
    const char drinks[4][10] = {
        "Coffee",
        "Tea",
        "Chocolate",
        "Soda"
    };
    const char sizes[3][10] = {
        "Small",
        "Medium",
        "Large"
    };
    char drinksName[10];
    do {
        printf("\nDrinks name: ");
        scanf("%s", drinksName);
        if (strcmp(drinksName, drinks[0]) != 0 || strcmp(drinksName, drinks[1]) != 0 || strcmp(drinksName, drinks[2]) != 0 || strcmp(drinksName, drinks[3]) != 0) {
            printf("Not available.");
        }
    } while (strcmp(drinksName, drinks[0]) != 0 || strcmp(drinksName, drinks[1]) != 0 || strcmp(drinksName, drinks[2]) != 0 || strcmp(drinksName, drinks[3]) != 0);
    do {
        printf("\nSize: ");
        scanf("%s", size);
        if (strcmp(size, sizes[0]) != 0 || strcmp(size, sizes[1]) != 0 || strcmp(size, sizes[2]) != 0) {
            printf("Not available.");
        }
    } while (strcmp(size, sizes[0]) != 0 || strcmp(size, sizes[1]) != 0 || strcmp(size, sizes[2]) != 0);
}

当我尝试运行我的程序时,输入总是循环,而我的输入为真,例如:“咖啡”。我的循环代码有错误吗?

do {
        printf("\nDrinks name: ");
        scanf("%s", drinksName);
        if (strcmp(drinksName, drinks[0]) != 0 || strcmp(drinksName, drinks[1]) != 0 || strcmp(drinksName, drinks[2]) != 0 || strcmp(drinksName, drinks[3]) != 0) {
            printf("Not available.");
        }
    } while (strcmp(drinksName, drinks[0]) != 0 || strcmp(drinksName, drinks[1]) != 0 || strcmp(drinksName, drinks[2]) != 0 || strcmp(drinksName, drinks[3]) != 0);

我很困惑为什么会这样。

【问题讨论】:

    标签: c string strcmp


    【解决方案1】:

    如果您的输入与 其中一个元素不同,则您的代码意味着继续循环。这个条件永远成立,因为有不同的元素。

    您应该使用&amp;&amp;(逻辑与)运算符而不是||(逻辑或)运算符来检查您输入的元素是否与所有元素不同,如下所示:

    do {
        printf("\nDrinks name: ");
        if (scanf("%9s", drinksName) != 1) {
            fputs("Read error.\n", stderr);
            return 1;
        }
        if (strcmp(drinksName, drinks[0]) != 0 && strcmp(drinksName, drinks[1]) != 0 && strcmp(drinksName, drinks[2]) != 0 && strcmp(drinksName, drinks[3]) != 0) {
            printf("Not available.");
        }
    } while (strcmp(drinksName, drinks[0]) != 0 && strcmp(drinksName, drinks[1]) != 0 && strcmp(drinksName, drinks[2]) != 0 && strcmp(drinksName, drinks[3]) != 0);
    

    另外请注意,您应该指定要读取的字符串的最大长度以避免缓冲区溢出,并检查scanf()的返回值以检查是否读取成功。

    另一种选择是使用循环来查找匹配的元素,如下所示:

    int matchFound;
    do {
        printf("\nDrinks name: ");
        if (scanf("%9s", drinksName) != 1) {
            fputs("Read error.\n", stderr);
            return 1;
        }
        matchFound = 0;
        for (size_t i = 0; i < sizeof(drinks) / sizeof(drinks[0]); i++) {
            if (strcmp(drinksName, drinks[i]) == 0) {
                matchFound = 1;
                break;
            }
        }
        if (!matchFound) {
            printf("Not available.");
        }
    } while (!matchFound);
    

    【讨论】: