itoa 函数!!!(window平台下)

本文深入探讨了itoa与atoi函数的功能、用法及其在不同平台下的特性,强调了它们在数字与字符串转换过程中的作用,并通过对比展示了在Windows与Linux平台上的差异,帮助开发者更准确地选择合适的函数进行应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里添加一个函数,防止以后忘了。


itoa 函数 : 功能是将一个数字转化为一个字符串

函数的头文件 : stdlib.h

还有一个函数和他的功能正好相反,atoi  

这个函数功能就是把一个字符串转化为一个数字。


注意 : 无论是atoi 还是itoa 这两个函数都是存在与windows 平台下,这两个函数不存在移植性。

在linux平台下有和他们两个函数相似的函数而且功能也是非常的强大,sprintf sscanf ;


itoa 函数声明 :  char * itoa (int num,char *string,int radix);

num : 表示要转化的数字

string : 表示转化结束的结果字符串

radix : 表示要转化的进制


itoa 函数返回的结果也是转化结束的结果字符串的地址。





#include <graphics.h> // EasyX图形库 #include <fstream> #include <string> #include <vector> #include <iomanip> #include <algorithm> using namespace std;; // 全局常量定义 const int WIDTH = 800; // 窗口宽度 const int HEIGHT = 600; // 窗口高度 const int MARGIN = 20; // 边距 const int BUTTON_HEIGHT = 40;// 按钮高度 const int INPUT_HEIGHT = 30; // 输入框高度 class InputBox; // 用户信息结构 class User { public: string nickname; string account; string password; int levelsCleared; }; // 按钮类,用于封装界面按钮 class Button { private: int x, y, width, height; string text; bool isHovered; COLORREF normalColor, hoverColor, textColor; public: Button(int _x, int _y, int _width, int _height, string _text) : x(_x), y(_y), width(_width), height(_height), text(_text), isHovered(false) { normalColor = RGB(200, 200, 200); hoverColor = RGB(150, 150, 150); textColor = RGB(0, 0, 0); } // 绘制按钮 void draw() { setfillcolor(isHovered ? hoverColor : normalColor); fillrectangle(x, y, x + width, y + height); settextcolor(textColor); settextstyle(20, 0, _T("宋体")); int textWidth = textwidth(text.c_str()); int textHeight = textheight(text.c_str()); outtextxy(x + (width - textWidth) / 2, y + (height - textHeight) / 2, text.c_str()); } // 检查鼠标是否在按钮上 bool isMouseOver(int mx, int my) { return mx >= x && mx <= x + width && my >= y && my <= y + height; } // 设置鼠标悬停状态 void setHovered(bool hover) { isHovered = hover; } string getText() const { return text; } }; // 输入框类 class InputBox { private: int x, y, width, height; string text; string placeholder; bool isFocused; COLORREF bgColor, borderColor, textColor, placeholderColor; public: InputBox(int _x, int _y, int _width, int _height, string _placeholder) : x(_x), y(_y), width(_width), height(_height), placeholder(_placeholder), isFocused(false) { bgColor = RGB(255, 255, 255); borderColor = RGB(150, 150, 150); textColor = RGB(0, 0, 0); placeholderColor = RGB(180, 180, 180); } // 绘制输入框 void draw() { // 绘制背景和边框 setfillcolor(bgColor); fillrectangle(x, y, x + width, y + height); setlinecolor(borderColor); rectangle(x, y, x + width, y + height); // 绘制文本或占位符 settextcolor(isFocused || !text.empty() ? textColor : placeholderColor); settextstyle(16, 0, _T("宋体")); if (text.empty() && !isFocused) { outtextxy(x + 5, y + (height - textheight(placeholder.c_str())) / 2, placeholder.c_str()); } else { outtextxy(x + 5, y + (height - textheight(text.c_str())) / 2, text.c_str()); } // 绘制光标 if (isFocused) { int cursorX = x + 5 + textwidth(text.c_str()); int cursorY = y + 5; int cursorHeight = height - 10; solidrectangle(cursorX, cursorY, cursorX + 2, cursorY + cursorHeight); } } // 处理键盘输入 void handleKey(int key) { if (!isFocused) return; if (key == VK_BACK) { // 退格键 if (!text.empty()) text.pop_back(); } else if (key == VK_RETURN) { // 回车键 isFocused = false; } else if (key >= 32 && key <= 126) { // 可打印字符 text += (char)key; } } // 设置焦点 void setFocus(bool focus) { isFocused = focus; } // 获取输入文本 string getText() const { return text; } // 清空输入文本 void clear() { text = ""; } bool isMouseOver(int mx, int my) const { return (mx >= x && mx <= x + width && my >= y && my <= y + height); } }; // 读取所有用户信息 vector<User> readUsers() { vector<User> users; ifstream file("users.txt"); if (file.is_open()) { string line; // 跳过标题行 if (getline(file, line)) { while (getline(file, line)) { User user; size_t pos1 = line.find('\t'); size_t pos2 = line.find('\t', pos1 + 1); size_t pos3 = line.find('\t', pos2 + 1); if (pos1 != string::npos && pos2 != string::npos && pos3 != string::npos) { user.nickname = line.substr(0, pos1); user.account = line.substr(pos1 + 1, pos2 - pos1 - 1); user.password = line.substr(pos2 + 1, pos3 - pos2 - 1); user.levelsCleared = stoi(line.substr(pos3 + 1)); users.push_back(user); } } } file.close(); } return users; } // 保存用户信息到文件 bool saveUsers(const vector<User>& users) { ofstream file("users.txt"); if (!file.is_open()) { return false; } // 写入标题行 file << "nickname\taccount\tpassword\tlevelsCleared" << endl; // 写入所有用户 for (const auto& user : users) { file << user.nickname << "\t" << user.account << "\t" << user.password << "\t" << user.levelsCleared << endl; } file.close(); return true; } // 主窗口类 class MainWindow { private: vector<Button> buttons; vector<InputBox> inputBoxes; vector<User> users; int currentPage; bool isAddingUser; string currentAccount; public: MainWindow() : currentPage(0), isAddingUser(false) { // 初始化图形窗口 initgraph(WIDTH, HEIGHT); setbkcolor(RGB(240, 240, 240)); cleardevice(); // 确保文件存在并写入标题行 ifstream checkFile("users.txt"); if (!checkFile.good()) { ofstream createFile("users.txt"); if (createFile.is_open()) { createFile << "nickname\taccount\tpassword\tlevelsCleared" << endl; createFile.close(); } } checkFile.close(); // 初始化界面元素 initUI(); } ~MainWindow() { closegraph(); } // 初始化用户界面 void initUI() { buttons.clear(); inputBoxes.clear(); if (isAddingUser) { // 添加用户界面 initAddUserUI(); } else { // 主菜单界面 initMainMenuUI(); } } // 初始化主菜单界面 void initMainMenuUI() { // 标题 settextcolor(RGB(50, 50, 200)); settextstyle(30, 0, _T("宋体")); outtextxy((WIDTH - textwidth(_T("用户信息管理系统"))) / 2, 50, _T("用户信息管理系统")); // 按钮 int buttonWidth = 200; int yPos = 150; buttons.push_back(Button((WIDTH - buttonWidth) / 2, yPos, buttonWidth, BUTTON_HEIGHT, "添加用户信息")); yPos += 80; buttons.push_back(Button((WIDTH - buttonWidth) / 2, yPos, buttonWidth, BUTTON_HEIGHT, "查看所有用户")); yPos += 80; buttons.push_back(Button((WIDTH - buttonWidth) / 2, yPos, buttonWidth, BUTTON_HEIGHT, "修改用户信息")); yPos += 80; buttons.push_back(Button((WIDTH - buttonWidth) / 2, yPos, buttonWidth, BUTTON_HEIGHT, "删除用户信息")); yPos += 80; buttons.push_back(Button((WIDTH - buttonWidth) / 2, yPos, buttonWidth, BUTTON_HEIGHT, "退出系统")); } // 初始化添加用户界面 void initAddUserUI() { // 标题 settextcolor(RGB(50, 50, 200)); settextstyle(24, 0, _T("宋体")); outtextxy((WIDTH - textwidth(_T("添加用户信息"))) / 2, 30, _T("添加用户信息")); // 输入框 int inputWidth = 300; char buffer[32]; _itoa_s((WIDTH - inputWidth) / 2, buffer, 10); int yPos = 100; inputBoxes.push_back(InputBox(buffer, yPos, _T("inputWidth"), _T("INPUT_HEIGHT"), "请输入昵称")); yPos += 60; inputBoxes.push_back(InputBox(buffer, yPos, _T("inputWidth"), _T("INPUT_HEIGHT"), "请输入账号")); yPos += 60; inputBoxes.push_back(InputBox(buffer, yPos, _T("inputWidth"), _T("INPUT_HEIGHT"), "请输入密码")); yPos += 60; inputBoxes.push_back(InputBox(buffer, yPos, _T("inputWidth"), _T("INPUT_HEIGHT"), "请输入通关数")); // 按钮 int buttonWidth = 120; yPos += 80; buttons.push_back(Button((WIDTH - buttonWidth * 2 - 20) / 2, yPos, buttonWidth, BUTTON_HEIGHT, "确认添加")); buttons.push_back(Button((WIDTH + buttonWidth * 2 + 20) / 2, yPos, buttonWidth, BUTTON_HEIGHT, "取消")); } // 绘制用户列表界面 void drawUserList() { cleardevice(); // 标题 settextcolor(RGB(50, 50, 200)); settextstyle(24, 0, _T("宋体")); outtextxy((WIDTH - textwidth(_T("用户信息列表"))) / 2, 30, _T("用户信息列表")); // 读取用户数据 users = readUsers(); if (users.empty()) { settextcolor(RGB(0, 0, 0)); settextstyle(18, 0, _T("宋体")); outtextxy((WIDTH - textwidth(_T("暂无用户信息"))) / 2, 100, _T("暂无用户信息")); // 返回按钮 int buttonWidth = 120; buttons.clear(); buttons.push_back(Button((WIDTH - buttonWidth) / 2, 180, buttonWidth, BUTTON_HEIGHT, "返回主菜单")); return; } // 绘制表头 settextcolor(RGB(0, 0, 0)); settextstyle(16, 0, _T("宋体")); outtextxy(MARGIN, 80, _T("昵称")); outtextxy(MARGIN + 120, 80, _T("账号")); outtextxy(MARGIN + 240, 80, _T("密码")); outtextxy(MARGIN + 360, 80, _T("通关数")); line(MARGIN, 100, WIDTH - MARGIN, 100); // 绘制用户数据 int yPos = 120; for (size_t i = 0; i < users.size(); i++) { if (yPos > HEIGHT - 100) break; outtextxy(MARGIN, yPos, users[i].nickname.c_str()); outtextxy(MARGIN + 120, yPos, users[i].account.c_str()); outtextxy(MARGIN + 240, yPos, users[i].password.c_str()); outtextxy(MARGIN + 360, yPos, to_string(users[i].levelsCleared).c_str()); yPos += 30; } // 按钮 int buttonWidth = 120; buttons.clear(); buttons.push_back(Button(MARGIN, HEIGHT - 80, buttonWidth, BUTTON_HEIGHT, "返回主菜单")); } // 处理修改用户界面 void processModifyUser() { cleardevice(); // 标题 settextcolor(RGB(50, 50, 200)); settextstyle(24, 0, _T("宋体")); outtextxy((WIDTH - textwidth(_T("修改用户信息"))) / 2, 30, _T("修改用户信息")); // 输入框 - 账号 int inputWidth = 300; char buffer[32]; _itoa_s((WIDTH - inputWidth) / 2, buffer, 10); inputBoxes.clear(); inputBoxes.push_back(InputBox(buffer, 100, "inputWidth", "INPUT_HEIGHT", "请输入要修改的用户账号")); // 按钮 int buttonWidth = 120; buttons.clear(); buttons.push_back(Button((WIDTH - buttonWidth) / 2, 180, buttonWidth, BUTTON_HEIGHT, "查找用户")); buttons.push_back(Button((WIDTH - buttonWidth) / 2, 240, buttonWidth, BUTTON_HEIGHT, "返回主菜单")); } // 显示用户修改界面 void showModifyUserInterface(const string& account) { cleardevice(); // 查找用户 users = readUsers(); User* userToModify = nullptr; for (auto& user : users) { if (user.account == account) { userToModify = &user; break; } } if (!userToModify) { settextcolor(RGB(200, 0, 0)); settextstyle(18, 0, _T("宋体")); outtextxy((WIDTH - textwidth(_T("未找到该用户!"))) / 2, 100, _T("未找到该用户!")); // 返回按钮 int buttonWidth = 120; buttons.clear(); buttons.push_back(Button((WIDTH - buttonWidth) / 2, 180, buttonWidth, BUTTON_HEIGHT, "返回主菜单")); return; } // 标题 settextcolor(RGB(50, 50, 200)); settextstyle(24, 0, _T("宋体")); outtextxy((WIDTH - textwidth(_T("修改用户信息"))) / 2, 30, _T("修改用户信息")); // 显示当前信息 settextcolor(RGB(0, 0, 0)); settextstyle(16, 0, _T("宋体")); outtextxy(MARGIN, 80, _T("当前用户信息:")); outtextxy(MARGIN, 110, ("昵称: " + userToModify->nickname).c_str()); outtextxy(MARGIN, 140, ("账号: " + userToModify->account).c_str()); outtextxy(MARGIN, 170, ("密码: " + userToModify->password).c_str()); outtextxy(MARGIN, 200, ("通关数: " + to_string(userToModify->levelsCleared)).c_str()); // 输入框 int inputWidth = 300; char buffer[32]; _itoa_s((WIDTH - inputWidth) / 2, buffer, 10); int yPos = 250; inputBoxes.clear(); inputBoxes.push_back(InputBox(buffer, yPos, _T("inputWidth"), _T("INPUT_HEIGHT"), "新昵称 (留空保持不变)")); yPos += 60; inputBoxes.push_back(InputBox(buffer, yPos, _T("inputWidth"), _T("INPUT_HEIGHT"), "新密码 (留空保持不变)")); yPos += 60; inputBoxes.push_back(InputBox(buffer, yPos, _T("inputWidth"), _T("INPUT_HEIGHT"), "新通关数 (留空保持不变)")); // 保存用户账号 currentAccount = account; // 按钮 int buttonWidth = 120; yPos += 80; buttons.push_back(Button((WIDTH - buttonWidth * 2 - 20) / 2, yPos, buttonWidth, BUTTON_HEIGHT, "确认修改")); buttons.push_back(Button((WIDTH + buttonWidth * 2 + 20) / 2, yPos, buttonWidth, BUTTON_HEIGHT, "取消")); } // 处理删除用户界面 void processDeleteUser() { cleardevice(); // 标题 settextcolor(RGB(50, 50, 200)); settextstyle(24, 0, _T("宋体")); outtextxy((WIDTH - textwidth(_T("删除用户信息"))) / 2, 30, _T("删除用户信息")); // 输入框 - 账号 int inputWidth = 300; char buffer[32]; _itoa_s((WIDTH - inputWidth) / 2, buffer, 10); inputBoxes.clear(); inputBoxes.push_back(InputBox(buffer, 100, "inputWidth", "INPUT_HEIGHT", "请输入要删除的用户账号")); // 按钮 int buttonWidth = 120; buttons.clear(); buttons.push_back(Button((WIDTH - buttonWidth) / 2, 180, buttonWidth, BUTTON_HEIGHT, "确认删除")); buttons.push_back(Button((WIDTH - buttonWidth) / 2, 240, buttonWidth, BUTTON_HEIGHT, "返回主菜单")); } // 运行主循环 void run() { ExMessage msg; // 消息结构 while (true) { cleardevice(); // 根据当前状态绘制界面 if (isAddingUser) { initAddUserUI(); } else { initMainMenuUI(); } // 绘制所有按钮 for (auto& button : buttons) { button.draw(); } // 绘制所有输入框 for (auto& input : inputBoxes) { input.draw(); } // 处理消息 if (peekmessage(&msg, EM_MOUSE | EM_KEY)) { // 鼠标消息 if (msg.message == WM_LBUTTONDOWN) { // 处理按钮点击 bool buttonClicked = false; for (auto& button : buttons) { if (button.isMouseOver(msg.x, msg.y)) { buttonClicked = true; string text = button.getText(); if (text == "添加用户信息") { isAddingUser = true; initUI(); } else if (text == "查看所有用户") { drawUserList(); } else if (text == "修改用户信息") { processModifyUser(); } else if (text == "删除用户信息") { processDeleteUser(); } else if (text == "退出系统") { closegraph(); return; } else if (text == "确认添加") { if (inputBoxes.size() >= 4) { User newUser; newUser.nickname = inputBoxes[0].getText(); newUser.account = inputBoxes[1].getText(); newUser.password = inputBoxes[2].getText(); string levelsText = inputBoxes[3].getText(); newUser.levelsCleared = levelsText.empty() ? 0 : stoi(levelsText); // 保存到文件 ofstream file("users.txt", ios::app); if (file.is_open()) { file << newUser.nickname << "\t" << newUser.account << "\t" << newUser.password << "\t" << newUser.levelsCleared << endl; file.close(); isAddingUser = false; } else { settextcolor(RGB(200, 0, 0)); outtextxy(100, 300, _T("保存失败!")); } } } else if (text == "取消") { isAddingUser = false; initUI(); } else if (text == "查找用户" && inputBoxes.size() > 0) { string account = inputBoxes[0].getText(); if (!account.empty()) { showModifyUserInterface(account); } } else if (text == "确认修改" && !currentAccount.empty() && inputBoxes.size() >= 3) { users = readUsers(); for (auto& user : users) { if (user.account == currentAccount) { string newNickname = inputBoxes[0].getText(); if (!newNickname.empty()) user.nickname = newNickname; string newPassword = inputBoxes[1].getText(); if (!newPassword.empty()) user.password = newPassword; string newLevels = inputBoxes[2].getText(); if (!newLevels.empty()) user.levelsCleared = stoi(newLevels); break; } } saveUsers(users); currentAccount = ""; initMainMenuUI(); } else if (text == "确认删除" && inputBoxes.size() > 0) { string account = inputBoxes[0].getText(); if (!account.empty()) { users = readUsers(); vector<User> newUsers; bool found = false; for (const auto& user : users) { if (user.account == account) { found = true; } else { newUsers.push_back(user); } } if (found) { saveUsers(newUsers); } else { settextcolor(RGB(200, 0, 0)); outtextxy(100, 300, _T("未找到该用户!")); } initMainMenuUI(); } } else if (text == "返回主菜单") { initMainMenuUI(); } break; } } // 处理输入框焦点 if (!buttonClicked) { for (auto& input : inputBoxes) { input.setFocus(input.isMouseOver(msg.x, msg.y)); } } } // 键盘消息 else if (msg.message == WM_KEYDOWN) { for (auto& input : inputBoxes) { input.handleKey(msg.vkcode); } } } FlushBatchDraw(); // 批量绘制,提高性能 Sleep(10); // 短暂休眠,降低CPU占用 } } }; int main() { MainWindow window; window.run(); return 0; }为什么在vector<InputBox> inputBoxes;中显示函数 "InputBox" 不是类型名,InputBox明明声明定义在MainWindow
最新发布
06-25
<think>我们正在解决C++中vector声明时类型InputBox未被识别的问题。用户的问题:声明`vector<InputBox>`时提示InputBox不是类型名。可能的原因及解决方法:1.**头文件未包含**:没有包含定义InputBox类的头文件。2.**命名空间问题**:InputBox类定义在某个命名空间中,使用时没有指定命名空间。3.**类名拼写错误**:类名拼写错误(包括大小写)或声明与定义不一致。4.**类未定义**:在声明vector时,InputBox类尚未定义(即编译器还未看到InputBox的定义)。5.**模板参数非类型**:InputBox可能是一个对象而不是类型(但根据问题描述,我们期望它是一个类或结构体类型)。根据引用[1]中提供的代码片段,我们并没有看到InputBox的定义,但是有一个名为`Box`的类。用户的问题是关于InputBox的,所以我们需要假设InputBox是用户自定义的一个类型。解决方案步骤:1.确保已经包含了定义InputBox类的头文件。例如:`#include"InputBox.h"`。2.如果InputBox类定义在某个命名空间(如`namespaceMyNamespace`)中,则在声明vector时需要加上命名空间,例如:`std::vector<MyNamespace::InputBox>`。3.检查类名的拼写,确保与定义完全一致(包括大小写)。4.确保在使用InputBox之前,编译器已经看到了它的定义。也就是说,定义InputBox的代码应该出现在声明vector之前。5.确认InputBox确实是一个类型(类或结构体),而不是一个变量或函数名。另外,引用[1]中有一个名为`Box`的类,并且其中有一个成员函数`inputbox`(注意是小写)。这里用户使用的是`InputBox`(首字母大写),所以可能是另一个类。因此,用户需要确认自己是否定义了一个名为`InputBox`的类。示例代码:假设我们有一个InputBox类的定义(在InputBox.h中):```cpp//InputBox.h#ifndefINPUTBOX_H#defineINPUTBOX_HclassInputBox{public://成员函数和变量};#endif```然后在需要使用的地方包含这个头文件:```cpp#include<vector>#include"InputBox.h"intmain(){std::vector<InputBox>boxes;//正确,InputBox是一个已知类型return0;}```如果InputBox在命名空间MyLib中:```cpp#include<vector>#include"InputBox.h"intmain(){std::vector<MyLib::InputBox>boxes;//使用命名空间限定return0;}```如果用户没有定义InputBox,而是想使用引用[1]中的Box类,那么应该改为`vector<Box>`。但是根据问题描述,用户明确写了InputBox,所以可能是用户自定义的另一个类。因此,请用户检查:-是否定义了InputBox类?-是否包含了定义InputBox类的头文件?-是否使用了正确的命名空间?-类名拼写是否正确?如果用户确认以上都没有问题,那么可能是头文件包含路径问题,需要检查编译器的包含路径设置。相关问题:1.在C++中如何正确包含自定义类的头文件?2.命名空间在C++中有什么作用?如何使用?3.如何解决C++中的“未定义类型”错误?4.vector模板使用时有哪些常见错误?5.C++中自定义类型的使用注意事项有哪些?</think>### C++中`vector<InputBox>`声明错误的原因及解决方法 #### 问题原因分析 当编译器提示"InputBox不是类型名"时,通常有以下原因: 1. **类型未定义**:编译器未找到`InputBox`类型的声明(最常见) 2. **头文件缺失**:未包含定义`InputBox`的头文件 3. **命名空间问题**:`InputBox`定义在特定命名空间但未正确引用 4. **拼写错误**:类名大小写不一致(如`inputbox` vs `InputBox`) 5. **声明顺序错误**:在使用点之前未定义类型 #### 解决方法 1. **确认类型定义存在** 检查是否正确定义了`InputBox`类: ```cpp // InputBox.h 或对应头文件 class InputBox { // 确保类名完全匹配 public: // 成员声明... private: // 数据成员... }; ``` 2. **包含必要的头文件** 在使用`vector<InputBox>`的源文件中包含定义文件: ```cpp #include "InputBox.h" // 自定义头文件 #include <vector> // STL vector头文件 ``` 3. **处理命名空间** 如果`InputBox`在命名空间中: ```cpp namespace GUI { class InputBox { ... }; } // 使用时 std::vector<GUI::InputBox> inputBoxes; // 正确限定命名空间 ``` 4. **检查声明顺序** 确保类型定义在使用之前: ```cpp class InputBox; // 前置声明(仅适用指针/引用) // 完整定义必须在vector实例化前可见 ``` 5. **验证类名一致性** 检查代码中所有位置使用**完全相同的拼写**(包括大小写),C++区分大小写: - `InputBox` ≠ `inputBox` - `InputBox` ≠ `InputBOX` #### 错误示例修正 参考您提供的`Box`类[^1],正确用法应为: ```cpp #include "Box.h" // 包含类定义头文件 #include <vector> int main() { std::vector<Box> boxList; // 正确使用已定义类型 // ... } ``` #### 常见陷阱排查 1. 检查头文件防护宏(`#ifndef HEADER_H`)是否冲突 2. 确保编译包含路径正确(IDE项目设置或makefile) 3. 验证类定义未被`#ifdef`条件编译块意外排除 4. 检查类模板参数是否匹配(如`vector<InputBox>`而非`vector<InputBox<T>>`) > **重要提示**:根据C++标准,模板类型参数必须是完整类型。编译器必须在实例化`vector<InputBox>`时看到`InputBox`的完整定义[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值