Я хочу проверить, чтобы строка, содержащаяся в массиве с именем secretWord
, не имела в ней символов (например, $% & #). Если в нем есть символ, я заставляю пользователя повторно вводить строку. Он использует рекурсию, чтобы продолжать просить, пока они не введут строку, которая не содержит символ.Как проверить, содержит ли индекс символ?
Единственный символ I do accept - это символ 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
Эта функция вызывается на третьей линии моего основного метода(), сразу после того, оператор печати в первой строке, который просит пользователей ввести слово, и оператор fgets() на второй строке, который получает вход, который используется этой функцией checkForSymbols.
По желанию, примером может быть, если я ввода «Hello» в качестве secretWord
строки. Затем программа запускает функцию на нем, и if
заявление по какой-то причине срабатывает, заставляя его
- Заменить все значения, хранящиеся в
secretWord
массиве со значением ASCII 0. (AKA NULL) - Распечатывает
No symbols are allowed in the word. Please try again:
на консоль. - Ждет нового ввода, который он будет хранить в массиве
secretWord
. - Вызывает метод
checkForSymbols()
для этих новых значений, хранящихся вsecretWord
.
И независимо от того, что вы вводите в качестве нового secretWord, в checkForSymbols()
метода if
заявление костров и повторяет шаги 1 - 4 снова.
Благодарим за терпение и понимание с вашей помощью!
Просьба указать [mcve], в том числе информацию о том, как считывался вход, что такое точный входной тест и как эта функция была вызвана. – kaylum
Вызывается ли flushArray до ввода пользователем в массив? Кроме того, почему бы просто не остановиться, когда вы найдете первый нуль (например, рассматриваете его как строку с завершающим нулем)? – samgak
Кроме того, вы должны научиться использовать отладчик, тогда вы можете увидеть, что это значение в массиве [i], который не прошел тест. Или вы можете просто распечатать его (или это значение ASCII) – samgak