打印出char数组时出现意外行为

时间:2017-06-03 20:39:30

标签: c avr avr-gcc

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

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

NMEA_RMC_t rmc;

在解析来自输入的数据之后,在另一个函数中操作char数组。尽管程序中的其他地方存在中断,但它们不会更新中断。在主代码中,如果我按如下方式打印它们 -

//main program loop
printf("lat: %s \t long: %s \n", rmc.latitude, rmc.longitude);

到终端的输出是这个 -

  

lat:+50.71735 long:

如果我按照不同的顺序打印它们 -

printf("long: %s \t lat: %s \n", rmc.longitude, rmc.latitude);

我得到了这个输出。

  

长:-001.39118 lat:

如果我将打印分成两个单独的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';

基本上它是从进来的数据流中解析信息。

2 个答案:

答案 0 :(得分:1)

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

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

您需要自己初始化数组 - 不要依赖编译器来执行此操作。

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

答案 1 :(得分:0)

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

这是一个一个一个错误的错误。 rmc.latitude[10]='\0';rmc.latitude数组的第11个位置放置0,但此数组声明只有10个位置。实际发生的是rmc.longitude[0]得到'\ 0'字符,因为它在内存中相邻。