文章

【GESP】C++三级练习 luogu-B2155 合法 C 标识符

GESP三级练习,字符串练习(C++三级大纲中6号知识点,字符串),难度★★☆☆☆。

luogu-B2155 合法 C 标识符

题目要求

题目描述

给定一个不包含空白符的字符串,请判断是否是 C 语言合法的标识符号。题目保证这些字符串一定不是 C 语言的保留字。

C 语言标识符要求:

  1. 非保留字;
  2. 只包含字母、数字及下划线(_);
  3. 不以数字开头。

输入格式

一行,包含一个字符串,字符串中不包含任何空白字符,且长度不大于 $20$。

输出格式

一行,如果它是 C 语言的合法标识符,则输出 yes,否则输出 no。

输入输出样例 #1

输入 #1

1
RKPEGX9R;TWyYcp

输出 #1

1
no

题目分析

解题思路

  1. 读取一个字符串str
  2. 检查字符串的首字符:
    • 必须是字母或下划线,否则输出”no”并结束程序
  3. 遍历字符串中的每个字符:
    • 检查当前字符是否为合法字符(字母、数字或下划线)
    • 如果出现非法字符:
      • 输出”no”并结束程序
  4. 如果所有字符都合法,输出”yes”

复杂度分析:

  • 时间复杂度为 $O(n)$,其中n为字符串长度
  • 空间复杂度为 $O(1)$,只需要存储输入的字符串


示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <string>

int main() {
    // 定义字符串变量用于存储输入
    std::string str;
    // 从标准输入读取字符串
    std::cin >> str;
    
    // 检查首字符是否合法(必须是字母或下划线)
    if (!(str[0] >= 'a' && str[0] <= 'z') &&
        !(str[0] >= 'A' && str[0] <= 'Z') && str[0] != '_') {
        std::cout << "no";
        return 0;
    }
    
    // 遍历字符串的每个字符
    for (int i = 0; i < str.length(); i++) {
        // 检查每个字符是否为合法字符(数字、字母或下划线)
        if (!(str[i] >= '0' && str[i] <= '9') &&
            !(str[i] >= 'a' && str[i] <= 'z') &&
            !(str[i] >= 'A' && str[i] <= 'Z') && str[i] != '_') {
            std::cout << "no";
            return 0;
        }
    }
    
    // 所有检查都通过,输出yes
    std::cout << "yes";
    return 0;
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

本文由作者按照 CC BY 4.0 进行授权