Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 打印字符数组时出现意外行为_C_Avr_Avr Gcc - Fatal编程技术网

C 打印字符数组时出现意外行为

C 打印字符数组时出现意外行为,c,avr,avr-gcc,C,Avr,Avr Gcc,我目前正试图通过UART在特定点打印一些变量的值来调试我的程序。我的问题是打印两个字符数组。我打印它们的顺序似乎对它是否打印有影响。数组的声明位于头文件的结构中,如下所示- //header file typedef struct { char latitude[10]; char longitude[11]; }NMEA_RMC_t; NMEA_RMC_t rmc; //main program loop printf("lat: %s \t long: %s \n", rmc.

我目前正试图通过UART在特定点打印一些变量的值来调试我的程序。我的问题是打印两个字符数组。我打印它们的顺序似乎对它是否打印有影响。数组的声明位于头文件的结构中,如下所示-

//header file
typedef struct
{
  char latitude[10]; 
  char longitude[11];
}NMEA_RMC_t;

NMEA_RMC_t rmc;
//main program loop
printf("lat: %s \t long: %s \n", rmc.latitude, rmc.longitude);
在解析来自输入的数据后,char数组在另一个函数中进行操作。虽然程序中的其他地方有中断,但它们不会被中断更新。在主代码中,如果我按如下方式打印它们-

//header file
typedef struct
{
  char latitude[10]; 
  char longitude[11];
}NMEA_RMC_t;

NMEA_RMC_t rmc;
//main program loop
printf("lat: %s \t long: %s \n", rmc.latitude, rmc.longitude);
终端的输出如下所示-

纬度:+50.71735长:

但是如果我以不同的顺序打印它们-

printf("long: %s \t lat: %s \n", rmc.longitude, rmc.latitude);
我得到这个输出

长:-001.39118拉特:

另外,如果我将打印拆分为两个单独的printf语句,则只有第一个print语句正确打印char数组。我以前没必要在这里寻求帮助,但这让我陷入了一周的困境。任何帮助都将不胜感激!干杯

编辑

程序写入数组的部分如下所示。对于纬度和经度数组,它基本上是相同的

/* now we are in first char of latitude */

/* copy latitude chars */
strlcpy ((char*)lat, (const char*)ptr_to_comma, 10 );/*copies most size-1, null terminated*/   //changed 11 to 10

/* default latitude presentation is ddmm.mmmmm 
    we need to change it to dd.mmmmmmm 
*/
unsigned char ind;
for (ind=0; ind<9; ind++)
{
    if (*ptr_to_comma == '.')
    {
        ptr_to_comma++;//step over '.'
    }
    if ( ind==2 )
    {
        lat[ind++]='.';
    }
    lat[ind] = *ptr_to_comma;
    ptr_to_comma++;
}
lat[10] = '\0'; //terminate
/* now lat == dd.mmmmmmm */

ptr_to_comma++; /*step over comma to the NS-indicator*/

/*catch NorthSouth-indicator and step*/
if ( *ptr_to_comma == 'N'){ /*if we are in the North*/
    sign = '+';
    rmc.ns_indicator = 'N';
} else if ( *ptr_to_comma == 'S'){ /*else we are in the South*/
    sign = '-';
    rmc.ns_indicator = 'S';
}
ptr_to_comma++;//step over NS-indicator
ptr_to_comma++;//step over comma to the longitude field

/* dd.mmmmmmm to dd.ddddddd */

_convert_minutes( (unsigned char*) lat+3 );

/* copy latitude with sign to the rmc-struct */
rmc.latitude[0] = sign;
strcpy ( (char*)rmc.latitude+1, (const char*)lat); 
rmc.latitude[10]='\0';
本质上,它是在分析来自传入数据流的信息。

要使%s正常工作,char数组必须有一个NUL终止符\0,它表示字符串的结尾

如果您没有留出空间,那么程序的行为是未定义的

您需要自己初始化数组-不要依赖编译器来完成


取出调试器并在printf点检查与rmc关联的内存。

用于转换字符串并将其放入结构的代码无意中在rmc的开头放置了一个“\0”字符。然后,代码继续使用正确的值填充数组的其余部分,但printf函数将rmc.longitude视为零长度字符串,并忽略下面的内容


这是一个一个接一个的错误。rmc.纬度[10]='\0';将0放置在rmc.latitude数组的第11个位置,但该数组被声明为只有10个位置。实际上发生的是rmc。经度[0]得到了“\0”字符,因为它在内存中是相邻的。

如何初始化数组?我怀疑它可能与UART接收器有关。可能字符串的其余部分尚未从较低层读取。接收缓冲区大小是多少?您确定已经从UART发送器读取了所有字节吗?即使我在两个单独的printf语句中打印这两个数组,第二个数组也无法正常工作,不管哪一个是第一个。我试着打印一些大的文本,结果都很顺利。谢谢你的建议。@GeorgeStokes,请看你的更新。rmc.latitude[10]='\0'实际将'\0'放在经度[0]上。请尝试rmc.latitude[9]='\0'您能推荐类似的内容吗?rmc.纬度[sizeofrmc.纬度-1]='\0';就我个人而言,为了安全起见,我会将整个阵列归零,至少一开始是这样,