为什么在使用toupper时字符会转换为数字



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)));

相关内容

  • 没有找到相关文章

最新更新