Определить, можно ли введенную строку использовать в качестве идентификатора переменной - C (СИ)
Формулировка задачи:
Определить, можно ли введенную строку использовать в качестве идентификатора переменной.
Решение задачи: «Определить, можно ли введенную строку использовать в качестве идентификатора переменной»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>
#define isunderscore(x) ((x) == '_')
bool IsStartingWithDigit(const char* const s)
{
if (isdigit(s[0])) return true;
else return false;
}
bool IsLanguageKeyword(const char* const variableName)
{
static const char* keywords[] = {"auto", "break", "case", "char", "const", "continue", "default",
"do", "double", "else", "enum", "extern", "float", "for", "goto", "if", "inline", "int", "long",
"register", "restrict", "return", "short", "signed", "sizeof", "static", "struct", "switch",
"typedef", "union", "unsigned", "void", "volatile", "while", "_Alignas", "_Alignof", "_Atomic",
"_Bool", "_Complex", "_Generic", "_Imaginary", "_Noreturn", "_Static_assert", "_Thread_local"
};
static const size_t keywordsCount = sizeof(keywords) / sizeof(*keywords);
bool isKeyword = false;
size_t i = 0;
while ((i < keywordsCount) && !isKeyword)
{
if (strcmp(variableName, keywords[i]) == 0) isKeyword = true;
i++;
}
return isKeyword;
}
bool HasInvalidCharacters(const char* const variableName)
{
bool hasInvalidCharacters = false;
size_t i = 0;
const size_t N = strlen(variableName);
while ((i < N) && !hasInvalidCharacters)
{
if (!isalnum(variableName[i]) && !isunderscore(variableName[i])) hasInvalidCharacters = true;
i++;
}
return hasInvalidCharacters;
}
bool IsVariableNameValid(const char* const variableName)
{
if (!IsStartingWithDigit(variableName) && !HasInvalidCharacters(variableName) &&
!IsLanguageKeyword(variableName)) return true;
else return false;
}
int main(void)
{
const char* testNames[] = {
"testNames",
"testNames123",
"testNames_123",
"testNames$$%123",
"0123testNames",
"int"
};
size_t N = sizeof(testNames) / sizeof(*testNames);
for (size_t i = 0; i < N; i++)
{
printf("name: '%s', result = '%s'\n", testNames[i], IsVariableNameValid(testNames[i]) ? "true"
: "false");
}
return 0;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы с функциями и строками
- Определяем функцию проверки первого символа на символ подчеркивания
- Определяем функцию проверки, является ли переменная именем языка (ключевым словом)
- Создаем массив с ключевыми словами языка
- Определяем функцию проверки наличия недопустимых символов в переменной
- Определяем функцию проверки валидности переменной имени
- В функции main создаем массив с тестовыми именами переменных
- Проверяем каждое тестовое имя на валидность с помощью функции IsVariableNameValid
- Выводим результаты проверки на экран
- Возвращаем 0, чтобы указать, что программа успешно завершилась