首页 > 解决方案 > C - strcspn() 函数跳过数组中较长的字符串

问题描述

我正在尝试编写一个简短的函数,该函数接受用户输入并从数组中返回此类输入的位置。

int main(){
char *deck[5] = {"1c", "4h", "7s", "10d"};
char *input[10];
scanf(" %c", &input);
    for (int x = 0; x < 53;){
        int check = strcspn(deck[x], input);
        if (check == 0){
            printf("%d", x);
            break;
        }
        else{
            x++;
            printf("why\n");
        }
    }
}

它适用于前三个(1c、4h、7s)并分别返回 0、1 和 2,但是当我输入 10d 时,该函数只返回 0 - 甚至没有打印出“为什么”。

为什么循环返回 0,我该如何解决?

标签: cfor-loop

解决方案


strcspn检查第一个字符串是否以第二个字符串中的任何字符集开头。当您键入10d时,它将返回 0,因为第一个字符串"1c"以 a 开头,'1'这是您阅读时使用的字符scanf。也许您应该使用strcmporstrncmp而不是strspn.

您的代码中还有几个问题:

char *input[10];char*是一个包含 10 个指针 ( )的数组。您可能是指一个字符数组(一个字符串),例如char input[10];.

格式%c仅扫描单个字符,而不是您键入的整个字符串。也许fgets随后删除'\n'\r'字符足以阅读您的输入。

for 循环可以超出数组的末尾。x < 53应该是x < 4

启用警告后,编译器可能会警告您代码中的一些问题。一般建议:启用编译器警告并修复它们。阅读您正在使用的函数的文档。


推荐阅读