如何只读取特定数量的字符

时间:2011-08-25 12:52:38

标签: c++ c

我有一个关于从结构中读取一组字符的小查询。例如:特定变量包含值“3242C976 * 32”(char - 类型)。我怎样才能得到这个变量的前8位。请帮助。

感谢。

编辑: 我正试着读信号:

Ex:$ ASWEER,2,X:3242C976 * 32

进入这个结构:

struct pg
    {
        char command[7];  // saves as $ASWEER,2,X:3242C976*32
        char comma1[1];  // saves as ,2,X:3242C976*32
        char groupID[1]; // saves as 2,X:3242C976*32
        char comma2[1]; // etc
        char handle[2]; // this is the problem, need it to save specifically each part, buts its not
        char canID[8];
        char checksum[3];
    }m_pg;

... 当将缓冲区存储到结构中时,它可以工作,但由于没有回车符,它会在每个char变量中保存其余的信号。所以,最后总会有垃圾。

5 个答案:

答案 0 :(得分:3)

你可以...... 将canID中的十六进制值转换为浮点数(取决于您希望如何显示它),例如

float value1 = HexToFloat(m_pg.canID); // find a conversion script for HexToFloat

CString val;
val.Format("0.3f",value1);

垃圾值实际上并没有存储在结构中,它只显示它,因为没有回车符,所以请根据需要格式化消息并使用CString val;

答案 1 :(得分:2)

如果“3242C976 * 3F”是c-string或std :: string,你可以这样做:

char* str = "3242C976*3F";
char first_byte = str[0];

或者使用任意内存块,您可以:

SomeStruct memoryBlock;
char firstByte;
memcpy(&firstByte, &memoryBlock, 1);

同样复制字符串或任意内存块中的前8位或1字节。

答案 2 :(得分:2)

编辑后(下面的原始答案)

只需按部分复制即可。在C中,这样的东西应该可以工作(也可以在C ++中工作,但可能不是惯用的)

strncpy(m_pg.command, value, 7); // m.pg_command[7] = 0; // oops
strncpy(m_pg.comma, value+7, 1); // m.pg_comma[1] = 0; // oops
strncpy(m_pg.groupID, value+8, 1); // m.pg_groupID[1] = 0; // oops
strncpy(m_pg.comma2, value+9, 1); // m.pg_comma2[1] = 0; // oops
// etc

此外,在结构成员中没有字符串终止符的空间(因此上面的oopses)。他们不是字符串。不要printf他们!


不要读超过8个字符。在C中,类似

char value[9]; /* 8 characters and a 0 terminator */
int ch;
scanf("%8s", value);

/* optionally ignore further input */
while (((ch = getchar()) != '\n') && (ch != EOF)) /* void */;
/* input terminated with ch (either '\n' or EOF) */

我相信上面的代码在C ++中也“有效”,但在该语言中可能不是惯用的

答案 3 :(得分:1)

如果你有一个字符指针,你可以设置str[8] = '\0';但要小心,因为如果缓冲区小于8(编辑: 9 )字节,这可能会导致问题。

(我只是假设已经持有字符串的变量的名称被称为str。替换变量的名称。)

答案 4 :(得分:1)

在我看来,你想要用逗号分割,并保存到那里。这可以使用strtok()来完成,根据逗号将字符串拆分为标记,或者使用strchr()查找逗号,使用strcpy()将字符串复制到逗号。