【发布时间】:2017-02-13 02:19:33
【问题描述】:
我想检查以确保包含在名为 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 语句就会运行(它会打印 No symbols are allowed in the word. Please try again: 并要求新的输入)。
我认为问题显然源于声明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。(AKA NULL) - 将
No symbols are allowed in the word. Please try again:打印到控制台。 - 等待将存储在
secretWord数组中的新输入。 - 对存储在
secretWord中的这些新值调用checkForSymbols()方法。
无论您输入什么作为新的 secretWord,checkForSymbols() 方法的 if 语句都会触发,它会再次重复步骤 1 到 4。
感谢您的耐心和理解!
【问题讨论】:
-
请提供minimal reproducible example,包括如何读取输入、测试的确切输入是什么以及如何调用此函数。
-
在用户输入放入数组之前是否调用了flushArray?另外,为什么不在找到第一个 null 时停止(即将其视为以 null 结尾的字符串)?
-
另外,你应该学会使用调试器,然后你可以看到 array[i] 中没有通过测试的值。或者你可以把它打印出来(或者是 ASCII 值)
-
fgets(secretWord, ...)没有secretWord。尽管您说这是递归的,但也不是。您的checkForSymbols调用checkforNums(我们很方便地看不到)。慢慢来,想想你的目标、问题和问题,并包含所有所需的代码,以一个最小的完整示例来演示问题。 -
解决这个问题的方法是确保
array是一个字符串(例如nul-terminated),然后确定你想要的符号排除(例如char *exclude = "$%&#";)。然后你可以简单地问if (strpbrk (array, exclude)) { ...handle array contains symbol... }。您还可以反转逻辑并检查array是否仅由a-zA-Z组成,同样容易。