我想检查以确保名为 secretWord
的数组中包含的给定字符串中没有符号(例如 $ % & #)。如果其中确实有符号,我会让用户重新输入该字符串。它利用递归不断询问,直到输入不包含符号的字符串。
我接受的唯一符号是NULL符号(由ASCII值零表示的符号)。这是因为我用 NULL 符号填充了数组中的所有空白区域。
我的功能如下:
void checkForSymbols(char *array, int arraysize){ //Checks for symbols in the array and if there are any it recursively calls this function until it gets input without them.
for (int i = 0; i < arraysize; i++){
if (!isdigit(array[i]) && !isalpha(array[i]) && array[i] != (char) 0){
flushArray(array, arraysize);
printf("No symbols are allowed in the word. Please try again: ");
fgets(secretWord, sizeof(secretWord) - 1, stdin);
checkForSymbols(secretWord, sizeof(secretWord));
}//end if (!isdigit(array[i]) && !isalpha(array[i]) && array[i] != 0)
else
continue;
}//end for(i = 0; i < sizeof(string[]); i++){
}//end checkForSymbols
问题:当我输入任何输入(参见下面的示例)时,if
语句就会运行(它打印Nosymbols are allowed in the word. Please再试一次:
并要求新的输入)。
我认为问题显然源于语句 if (!isdigit(array[i]) && !isalpha(array[i]) && array[i] != (char) 0)
。但我也尝试将 (char) 0
部分更改为 '\0'
和 0
,但这两种更改都没有任何效果。
那么如何比较索引中的内容是否是符号呢?为什么没有符号的字符串会关闭此 if 语句?
如果你们有人想知道我使用的“flushArray”方法是什么,那就是:
void flushArray(char *array, int arraysize){ //Fills in the entire passed array with NULL characters
for (int i = 0; i < arraysize; i++){
array[i] = 0;
}
}//end flushArray
该函数在 main() 方法的第三行调用,紧接在第一行要求用户输入单词的 print 语句之后,以及第二行获取输入的 fgets() 语句之后这个checkForSymbols函数就用在了。
根据请求,一个示例是,如果我输入“Hello”作为 secretWord
字符串。然后程序在其上运行该函数,并且 if
语句由于某种原因被触发,导致它
- 将
secretWord
数组中存储的所有值替换为 ASCII 值 0。(也称为 NULL) - 打印
单词中不允许有任何符号。请重试:
到控制台。 - 等待将存储在
secretWord
数组中的新输入。 - 对
secretWord
中存储的这些新值调用checkForSymbols()
方法。
无论您输入什么内容作为新的 SecretWord,checkForSymbols()
方法的 if
语句都会触发,并再次重复步骤 1 - 4。
感谢您的耐心和理解,并提供帮助!
最佳答案
您可以执行类似的操作来查找代码中的符号,将代码放在正确的位置
#include <stdio.h>
#include <string.h>
int main () {
char invalids[] = "@.<#>";
char * temp;
temp=strchr(invalids,'s');//is s an invalid character?
if (temp!=NULL) {
printf ("Invalid character");
} else {
printf("Valid character");
}
return 0;
}
这将检查 s
是否是有效条目,或者类似地,您可以创建一个数组,并在数组不是 null 终止时执行类似的操作。
#include <string.h>
char false[] = { '@', '#', '&', '$', '<' }; // note last element isn't '\0'
if (memchr(false, 'a', sizeof(false)){
// do stuff
}
如果您的数组不是 null 终止,则使用 memchr
。
根据@David C.Rankin的建议,您还可以使用strpbrk
,例如
#include <stdio.h>
#include <string.h>
int main () {
const char str1[] = ",*#@_$&+.!";
const char str2[] = "@#"; //input string
char *ret;
ret = strpbrk(str1, str2);
if(ret) {
printf("First matching character: %c\n", *ret);
} else {
printf("Continue");
}
return(0);
}
关于c - 如何检查索引是否包含符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42195699/