函数
tinyc.h
#ifndef _TINYC_H
#define _TINYC_H
#include <string>
#include <vector>
#include <map>
namespace tinyc {
using token_t = std::map<std::string, std::string>;
using tokens_t = std::vector<token_t>;
// const std::string DIGITS = "0123456789";
// const std::string WHITESPACE = " tn";
tokens_t tokenize(const std::string& str);
void print_tokens(const tokens_t& tokens);
} // namespace tinyc
#endif // _TINYC_H
main.cpp
#include <iostream>
#include "tinyc.h"
int main() {
tinyc::tokens_t tokens;
try {
tokens = tinyc::tokenize("()");
} catch (const std::string& e) {
std::cerr << e << 'n';
}
tinyc::print_tokens(tokens);
}
这就是整个代码。
在tinyc.h
中的这部分代码中:
void print_tokens(const tokens_t& tokens) {
if (!tokens.empty()) {
for (const token_t& token : tokens) {
for (const auto& token_pair : token) { // std::pair<...>
for (const char& c : token_pair.first) { // token_pair.first = std::string
std::cout << ::toupper(static_cast<unsigned char>(c));
}
std::cout << ':' << token_pair.second << 'n';
}
}
}
}
在这个部分中,这里是:
std::cout << ::toupper(static_cast<unsigned char>(c)); // Prints random digits. No idea why!? Changed toupper to tolower, un-typecasted it, etc, but nothing worked.
打印随机数字。我不知道为什么。我把toupper
改成了tolower
,没有打字等等,但什么都没用。
但出于某种原因,下面的代码运行得非常好:
std::cout << c;
下面的代码std::cout << c
工作得非常好,可以打印实际字符,而不是任何随机数字。
我也尝试过(c & ~32)
对其进行大写,但结果相同,它打印随机数字。
tokens.push_back({
{ "type", "rparen" },
{ "value", ")" }
});
这就是我在向量中插入贴图的方式;我做错了吗?这就是问题的原因吗?
为什么这是打印随机数字,而它应该打印字符?
int toupper( int ch );
继承自C,因此它返回int
。要正确打印,您需要重新键入字符:
std::cout << static_cast<char>(::toupper(static_cast<unsigned char>(c)));