在c中创建一个以start和end结尾的子字符串

时间:2017-03-19 19:22:52

标签: c arrays string char substring

对于我的学校项目,我需要编写一个gps模块。该模块通过UART向我发送了ASCII,我已将它们分成一个大字符串。 gps-module发送了一条非常大的消息,但我只需要一个部分:

$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGLL,4841.9388,N,01600.3418,E,000016.015,V,N*48
$GPZDA,000016.015,22,08,1999,,*55
$GPGSV,1,1,01,28,-90,000,33*66
$PERDCR,11,0,0,0.00,0.00,0.00,0.00,0.0,0,0,0.0,0,0,255,0,F,999*43
$PERDCR,1,32540,0,817,16,0,52,0,91,0,0,0,33,0x00,*41
$GPRMC,000017.015,V,4841.9388,N,01600.3418,E,0.00,0.00,220899,,,N*76
**$GPGGA,000017.015,4841.9388,N,01600.3418,E,0,00,0.0,277.9,M,0.0,M,,*6E** <-this part

粗体部分可以在此包装中的任何位置。我在

中保存了包裹
char data[507];

如何从$ GPGGA - * 6E获取数据? 注意:数据更改以及GPGGA-Package的位置发生变化。唯一不变的两个参数是起始字符串:&#34; $ GPGGA&#34;和GPGGA消息的长度,在这种情况下:70

2 个答案:

答案 0 :(得分:0)

谢谢你好! 我没有关于strncpy的功能。我在开始时尝试的是我得到了一个“$”的位置,然后是位置+ 1 =“G”,位置+ 2 =“P”等等(如果是)。而且我知道它无法正常工作,因为我正在使用ISR和BAUD-Rate = 9600,因此我的代码会经常变为如此多的if。

非常感谢您的所有回复,特别是Mister joell! 注意:start必须是int类型(position是一个整数值)

答案 1 :(得分:-1)

您可以使用strstr查找字符串的第一个匹配项。您也可以使用strstr查找结尾,但由于您知道长度始终为70,因此您无需搜索。

// Proof of concept (uncompiled)
char* start = strstr(data, "$GPGGA");
strncpy(message, start, 70);

参考:strncpy/strncpy_s