Определить, можно ли введенную строку использовать в качестве идентификатора переменной - 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;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы для работы с функциями и строками
  2. Определяем функцию проверки первого символа на символ подчеркивания
  3. Определяем функцию проверки, является ли переменная именем языка (ключевым словом)
  4. Создаем массив с ключевыми словами языка
  5. Определяем функцию проверки наличия недопустимых символов в переменной
  6. Определяем функцию проверки валидности переменной имени
  7. В функции main создаем массив с тестовыми именами переменных
  8. Проверяем каждое тестовое имя на валидность с помощью функции IsVariableNameValid
  9. Выводим результаты проверки на экран
  10. Возвращаем 0, чтобы указать, что программа успешно завершилась

Оцени полезность:

6   голосов , оценка 4.333 из 5
Похожие ответы