非常基本的问题。我在将char
转换为指向实际角色的char*
时遇到问题。谷歌搜索产生了关于strcpy,string,sprintf等的信息。经过多次尝试解决问题的尝试,我仍然无法让它工作。
我有一个字符数组recv_msg
,其中包含我需要的字符的ASCII值。我需要将字符(而不是值)存储在向量msg
中。
我有什么:
std::vector<char> msg;
char recv_msg[max_buffer_length];
...
int i;
for (i=0;i<bytes_transferred;i++) {
msg.push_back(recv_msg[i]);
}
// Problem: when I process my msg I see 49 instead of '1'.
如果我执行以下操作作为完整性检查,我确实得到了我需要的行为。也就是说,我看到的是'5'而不是53(5的ASCII码)。
std::vector<char*> msg;
...
int i;
char *val;
for (i=0;i<bytes_transferred;i++) {
msg.push_back(val);
}
// No problem: when I process my msg I see '5' instead of 53.
所以我需要将ASCII码值(char
)转换为它们的字符表示(char *
)。我该怎么做呢?
我想在这个阶段解决问题,而不必做ASCII - &gt;处理邮件时的字符转换。
答案 0 :(得分:2)
char
只是一个数字,所以如果您将其视为53
而不是'5'
,那就是因为您正在显示它。
您可以更改为将传入的消息存储为字符串,例如:
std::vector<std::string> msg;
char recv_msg[max_buffer_length];
...
int i;
for (i=0;i<bytes_transferred;i++) {
msg.push_back(std::string(&recv_msg[i], 1));
}
但如果真的只有单个字符,这似乎效率低下。另一种方法是在你对角色“做某事”时转换为字符串,例如:
std::string str(&msg.back(), 1);
甚至:
char str[2];
str2[0] = msg.back();
str2[1] = '\0';
答案 1 :(得分:1)
基于您的
“我需要将字符(而不是值)存储在矢量msg”
中请尝试以下操作,btw ASCII 53
仅为'5'
,可能只是您的recv_msg
商店ascii值。
std::vector<char> msg;
char recv_msg[max_buffer_length];
...
int i;
for (i=0;i<bytes_transferred;i++) {
msg.push_back(recv_msg[i] - '0'); //Subtract 48 from numerals,
}
答案 2 :(得分:1)
char
和char *
之间的差异与字符的表示及其数字表示完全无关。
使用ASCII:
printf("%c\n", '5');
为您提供5
和:
printf("%d\n", '5');
给你53
。它始终以存储作为53
,将其转换为可打印的5
字符只是您选择如何输出它的问题 - 您无法“存储字符(不是值)“,因为值总是存储的。即使您在源代码中编写'5'
,您的编译器也会将其转换为53
,即:
if ( '5' == 53 ) {
puts("This will always print.");
}