1

很基本的问题。我在将 a 转换为指向实际字符的 a 时遇到char问题char*。谷歌搜索产生了有关 strcpy、string、sprintf 等的信息。经过多次尝试理解问题后,我仍然无法让它工作。

我有一个字符数组recv_msg,其中包含我需要的字符的 ASCII 值。我需要将字符(而不是值)存储在 vectormsg中。

我有的:

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 -> 字符转换。

4

3 回答 3

2

Achar只是一个数字,所以如果你看到它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';
于 2013-07-31T19:44:37.170 回答
1

根据您的

“我需要将字符(而不是值)存储在向量 msg 中”

试试看,顺便说一句,ASCII53只是'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, 
}
于 2013-07-31T19:44:20.823 回答
1

和之间的区别charchar *字符的表示及其数字表示完全无关。

使用 ASCII:

printf("%c\n", '5');

给你5,并且:

printf("%d\n", '5');

给你53。它总是被存储53,将它变成一个可打印的5字符只是你如何选择输出它的问题——你不能“存储字符(而不是值)”,因为值总是你存储的。即使您'5'在源代码中编写,您的编译器也会将其转换为53,即:

if ( '5' == 53 ) {
    puts("This will always print.");
}
于 2013-07-31T19:52:45.723 回答