【发布时间】:2018-05-12 04:40:17
【问题描述】:
我对一串符号及其值有疑问。我想获取每段字符串的数据并将其保存到自己的缓冲区中。 例如来自这个字符串:
char str = "+TY123-UP65.4-FA545-MTE565-MTD65-MTT230-MPE545-MPD656-MPT345-";
我想在每个符号取代它之后比较字符。首先是表示新数据字符串的“+”号。然后我想在“-”符号出现之前比较前两个或三个值(它表示部分结束),如果它是,例如,数字之前的 TY,则将数字(int 或 float)保存到“TYbuffer”之后" 直到 "-" 符号。然后在“-”之后再次检查哪些字母在前,如果是“UP”,则将其保存到“UPbuffer”中,依此类推。
首先,我像这样遍历字符串:
size_t len = strlen(str);
size_t i;
for (i=0;i<len;i++){ //go through the string
int j=0;
if (str[j] == '+' && str[j+1]=='T'){ //Check for the letters
}
}
这是我将如何做的一个示例,但问题是数字可以更大或更小,因此可以移动位置。我对解决问题有点困惑。我尝试从字符串中提取数字,但后来这个人不知道它来自哪个特定部分。像这样:
char tmp[20];
void loop() {
char *str = "+TY123-UP65.4-FA545-MTE565-MTD65-MTT230-MPE545-MPD656-MPT345-";
char *p = str;
while (*p) {
if (str == 'T'){
while (*p) {
if (isdigit(*p)) { // Upon finding a digit
long val = strtol(p, &p, 10); // Read a number
sprintf(tmp, "%1d", val);
Serial.println(val); // and print it
} else {
p++;
}
}
作为参考,我使用的是 Arduino 平台。
我已经设法从字符串中提取了 int/float 值,但我必须处理一些错误。我去掉了开头的“+”号。这是进一步的代码:
#include <stdlib.h>
void setup() {
Serial.begin(9600);
char str[] = "TY123-UP65.4-FA545-MTE565-MTD65-MTT230-MPE545-MPD656-MPT345-";
Serial.write(str);
analyzeString(str);
}
void loop() {
}
void analyzeString(char* str) {
int count = 0; //start the count
char buff[20]; //initialiye the buffer for 20 char
for(int i = 0; i<strlen(str); i++) { //start the loop for reading the characters from whole string
if(str[i] == '-') { //start the loop when "-" occurs
char bufNum[20]; //buffer for the number in a seperate section
//char bufNum1[20];
if (buff[0] == 'T' && buff[1] == 'Y') { //If the first letter in a buffer is U and second is P
for(int j = 2; j<count; j++) {
bufNum[j-2] = buff[j];
}
bufNum[count-2] = '\0';
Serial.println();
int ty = atoi(bufNum); //atof(string) for float, atoi(string) for int
Serial.print(ty); //float constant
} else if (buff[0] == 'U' && buff[1] == 'P'){
for(int j = 2; j<count; j++) {
bufNum[j-2] = buff[j];
}
bufNum[count-2] = '\0';
Serial.println(bufNum);
float up = atof(bufNum);
Serial.print(up);
} else if (buff[0] == 'F' && buff[1] == 'A'){
for(int j = 2; j<count; j++) {
bufNum[j-2] = buff[j];
}
bufNum[count-2] = '\0';
Serial.println(bufNum);
int fa = atoi(bufNum);
Serial.print(fa);
}
count =0;
} else {
buff[count++] = str[i];
}
}
}
错误在输出中,因为它会输出如下部分的下一个值:
TY123-UP65.4-FA545-MTE565-MTD65-MTT230-MPE545-MPD656-MPT345-
12365.4
65.40545
545
我正在寻找有关如何解决问题的指南。我将不胜感激任何帮助。谢谢你。
【问题讨论】:
-
听起来你需要对字符串进行标记。
-
Serial.println(val);: 这是C吗? Arduino? -
mnistic 是对的,看看在循环中使用 strtok() 来标记指定字符上的字符串(在本例中为“-”)。这将去掉“-”字符,并为您提供一个指向您实际想要查看的数据的指针。
-
是的,是的,我注意到它是 Arduino 平台。 @Jean-FrançoisFabre
-
太好了,我正在研究解决方案,它看起来很有希望。谢谢你。 @K_TrenholmGDC