крошечный.ч
#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 = " \t\n";
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", ")" }
});
Вот как я вставляю карту в вектор; я делаю это неправильно? Это то, что вызывает проблему?
Почему это печатает случайные цифры, когда должно печатать символы?
toupper
возвращаетint
, поэтому, хотя он должен возвращать правильное значение, тип заставляет его распечатываться в десятичном виде, а не в виде символа. Вы можете вернуть его кchar
перед печатью. - person Nate Eldredge   schedule 17.12.2020toupper
возвращаетint
. Если вы хотите напечатать его какchar
, вам нужно привести результат. en.cppreference.com/w/cpp/string/byte/toupper - person Retired Ninja   schedule 17.12.2020std::cout << static_cast<char>(::toupper(static_cast<unsigned char>(c)));
- person Jack Murrow   schedule 17.12.2020std::cout << ::toupper(static_cast<unsigned char>(c));
. Минимальная функцияmain
, обеспечивающая синтаксическую работу этой строки, — этоint main() { const char c = 'a'; std::cout << ::toupper(static_cast<unsigned char>(c)); }
. Насколько близко к этому минимальному синтаксису вы можете вести свой пример, сохраняя при этом сомнительное поведение? - person JaMiT   schedule 17.12.20208238924982
в выводе, поэтому они появлялись как случайные цифры. - person Jack Murrow   schedule 17.12.2020