c - 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,我该如何解决?
解决方案
strcspn
检查第一个字符串是否以第二个字符串中的任何字符集开头。当您键入10d
时,它将返回 0,因为第一个字符串"1c"
以 a 开头,'1'
这是您阅读时使用的字符scanf
。也许您应该使用strcmp
orstrncmp
而不是strspn
.
您的代码中还有几个问题:
char *input[10];
char*
是一个包含 10 个指针 ( )的数组。您可能是指一个字符数组(一个字符串),例如char input[10];
.
格式%c
仅扫描单个字符,而不是您键入的整个字符串。也许fgets
随后删除'\n'
和\r'
字符足以阅读您的输入。
for 循环可以超出数组的末尾。x < 53
应该是x < 4
。
启用警告后,编译器可能会警告您代码中的一些问题。一般建议:启用编译器警告并修复它们。阅读您正在使用的函数的文档。
推荐阅读
- java - 在spring boot中使用之前如何KMS解密application.properties中的密码
- windows - 在bat中处理文本文件时如何不丢失特殊字符?
- javascript - 在 php 文件上使用 js 的计时器使输入和 textarea 样式返回为默认值
- html - 如何检查按钮是否被第二次点击?
- asp.net - asp.net中继器控件内的引导网格
- arrays - 如何使用 Observable 填充 Angular Mat-Table
- javascript - Making a conditional function more efficient
- python - Import two modules in Main file, and call methods in them from each other
- html - 如何使用@media 修改动画
- json - Process multi-level nested escaped JSON strings inside JSON with fluentd