使用 memcpy 函数 C++ 复制 char 数组

copying char array using memcpy function C++

我正在解析 char 数组中的 GPS 位置,如下所示:

+CGNSINF: 1,1,20200103230006.000,36.100094,-95.925093,190.100,0.00,113.3,1,,1.1,1.4,0.9,,10,6,,,32,,

我想获取经纬度,所以我使用memcpy函数从数组中复制如下:

char latitude[8];
char longitude_1[8];
char s1[] = "+CGNSINF: 1,1,20200103230006.000,36.100094,-95.925093,190.100,0.00,113.3,1,,1.1,1.4,0.9,,10,6,,,32,,";
char* position;
position = strstr(s1,".000");
memcpy(longitude, position+5, 9);
memcpy(latitude, position+15,10);
printf("long: %s\r\n",longitude);
printf("lat: %s\r\n",latitude);

输出:

long: 36.10009-95.925093                                                                                                                                                           
lat: -95.925093 

所以输出显示纬度刚好 10 个字节,但经度太奇怪了,需要一些纬度!有什么解决办法吗?使用 memcpy 以外的其他函数。

memcpy(longitude, position+5, 9);

你将9个个字符复制到8个[的数组中=31=] 个元素(假设 longitude 你的意思是 longitude_1)。

然后您将此数组打印为以 null 结尾的字符串,但实际上并没有终止它。

所有这些导致未定义的行为

首先您需要确保数组足够大以容纳您复制到其中的字符,加上 终止符。然后你需要在字符串的末尾添加终止符。两者都可以通过增加数组的大小然后在定义时初始化它来完成:

char longitude_1[10] = "";  // 9 characters, plus terminator
                            // all elements initialized to zero (the string null-terminator

试试这个方法,当需要来自同一行的更多字段时它会有很大帮助:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
        char latitude[11];
        char longitude[11];
        char s1[] = "+CGNSINF: 1,1,20200103230006.000,36.100094,-95.925093,190.100,0.00,113.3,1,,1.1,1.4,0.9,,10,6,,,32,,";
        char unused[20];
        sscanf(s1, "%20[^,],%20[^,],%20[^,],%11[^,],%11[^,],", unused, unused, unused, latitude, longitude);

        printf("lat: %s\n", latitude);
        printf("long: %s\n", longitude);
}