在ICCAR中C语言编程,如何截取字符数组的其中几个元素赋给另外一个数组,我的程序老是不正确,请高手指点

#include <iom16v.h>
#include <macros.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define mclk 8000000
#define uchar unsigned char
#define uint unsigned int
#pragma interrupt_handler uart_rx:12
uchar rdata;
uchar flag=0;
//异步串行通信寄存器配置的初始化子函数
void uart_init(uint baud)
{
UCSRB=0x00;
UCSRA=0x00; //控制寄存器清零
UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);
//选择UCSRC,异步模式,禁止
// 校验,1位停止位,8位数据位(0X86)
baud=mclk/16/baud-1; //波特率最大为65K
UBRRL=baud;
UBRRH=baud>>8; //设置波特率
UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
//接收、发送使能,接收中断使能(0X98)
SREG=BIT(7); //全局中断开放(0X80)
DDRD|=0X02; //配置TX为输出(很重要)

}

//发送数据子函数
void uart_sendB(uchar data)
{
while(!(UCSRA&(BIT(UDRE)))) ; //查询UCSRA的数据寄存器是否为空,即是否准备好接受新的数据,为空时(UDRE=1)准备发送数据
UDR=data;
while(!(UCSRA&(BIT(TXC)))); //查询UCSRA的数据寄存器是否发送结束
UCSRA|=BIT(TXC); //查询写1操作将TXC清零
}
void uart_sendstr(uchar*sendpt)
{
while(*sendpt) //字符串未结束则继续发送
{
uart_sendB(*sendpt++);
}
}
uchar uart_rx()
{
UCSRB&=~BIT(RXCIE); //关中断
rdata=UDR;
flag=1;
UCSRB|=BIT(RXCIE);

}

void main()
{

uint i;
char sp[3],lx[1],ly[1],cx1[1],cy1[1],cx2[1],cy2[1];
char tdata[]="123456";
uart_init(19200);
while(1)
{
if(flag)
{
uart_sendstr(tdata);
for(i=0;i<3;i++)
sp[i]=tdata[i];
uart_sendstr(sp);
for(i=0;i<1;i++)
lx[i]=tdata[i+3];
for(i=0;i<1;i++)
ly[i]=tdata[i+4];
for(i=0;i<1;i++)
cx1[i]=tdata[i+5];
for(i=0;i<1;i++)
cy1[i]=tdata[i+6];
for(i=0;i<1;i++)
cx2[i]=tdata[i+7];
for(i=0;i<1;i++)
cy2[i]=tdata[i+8];
flag=0;
}
}
}
运用串口调试助手发现,数组sp[]的元素和tdata 一样,按说不应该啊,我只是把tdata的前三个元素赋给了sp,怎么回事啊?

你的uart_sendstr,是以‘\0' 判断结束循环,可char sp[3]少分配了尾部的‘\0’ ,sp[3] 实际上就是lx[0]的位置(是啥天知道)...(在栈中分配字符串数组,相邻的会连续分配在一起,这结果与编译器有关),因此你执行后看上去是sp[]的元素和tdata 一样,实际上是后面
,lx[1],ly[1],cx1[1],cy1[1],cx2[1],cy2[1]的值。这个结果肯定不是你要的,你应该这样写:
char sp[4] ... //增加一个‘\0' 结尾空间
for(i=0;i<3;i++)
sp[i]=tdata[i];
sp[i]=0; // 加个‘\0'
uart_sendstr(sp);
温馨提示:答案为网友推荐,仅供参考
相似回答