学习uip代码分析时遇到的c语言问题

在进一步看uip的代码时,遇到了一个问题,可能是自己C语言知识不够扎实,特此总结一下

以下是http协议处理输入数据并更新页面显示的代码

 

static PT_THREAD(handle_input(struct httpd_state *s))
{      
char *strx;
u8 dbuf[17];
PSOCK_BEGIN(&s->sin);  
PSOCK_READTO(&s->sin, ISO_space);  
if(strncmp(s->inputbuf, http_get, 4)!=0)PSOCK_CLOSE_EXIT(&s->sin); //比较客户端浏览器输入的指令是否是申请WEB指令 “GET ”   
PSOCK_READTO(&s->sin, ISO_space);     //" "
if(s->inputbuf[0] != ISO_slash)PSOCK_CLOSE_EXIT(&s->sin); //判断第一个(去掉IP地址之后)数据,是否是"/"
if(s->inputbuf[1] == ISO_space||s->inputbuf[1] == '?') //第二个数据是空格/问号

if(s->inputbuf[1]=='?'&&s->inputbuf[6]==0x31)//LED1  
{  
LED0=!LED0; 
strx=strstr((const char*)(data_index_html+13),"LED0状态");  
if(strx)//存在"LED0状态"这个字符串
{
strx=strstr((const char*)strx,"color:#");//找到"color:#"字符串
if(LED0)//LED0灭
{
strncpy(strx+7,"5B5B5B",6); //灰色
strncpy(strx+24,"灭",2); //灭
strx=strstr((const char*)strx,"http:");//找到"http:"字符串 
strncpy(strx,(const char*)LED_OFF_PIC_ADDR,strlen((const char*)LED_OFF_PIC_ADDR));//LED0灭图片  
}else
{
strncpy(strx+7,"FF0000",6); //红色
strncpy(strx+24,"亮",2); //"亮"
strx=strstr((const char*)strx,"http:");//找到"http:"字符串 
strncpy(strx,(const char*)LED0_ON_PIC_ADDR,strlen((const char*)LED0_ON_PIC_ADDR));//LED0亮图片  
} 
}  
}else if(s->inputbuf[1]=='?'&&s->inputbuf[6]==0x32)//LED2  
{  
LED1=!LED1; 
strx=strstr((const char*)(data_index_html+13),"LED1状态");  
if(strx)//存在"LED1状态"这个字符串
{
strx=strstr((const char*)strx,"color:#");//找到"color:#"字符串
if(LED1)//LED1灭
{
strncpy(strx+7,"5B5B5B",6); //灰色
strncpy(strx+24,"灭",2); //灭
strx=strstr((const char*)strx,"http:");//找到"http:"字符串 
strncpy(strx,(const char*)LED_OFF_PIC_ADDR,strlen((const char*)LED_OFF_PIC_ADDR));//LED1灭图片  
}else
{
strncpy(strx+7,"00FF00",6); //绿色
strncpy(strx+24,"亮",2); //"亮"
strx=strstr((const char*)strx,"http:");//找到"http:"字符串 
strncpy(strx,(const char*)LED1_ON_PIC_ADDR,strlen((const char*)LED1_ON_PIC_ADDR));//LED1亮图片  
} 

}
strx=strstr((const char*)(data_index_html+13),"℃");//找到"℃"字符
if(strx)
{
get_temperature(dbuf); //得到温度  
strncpy(strx-4,(const char*)dbuf,4); //更新温度 
}
strx=strstr((const char*)strx,"RTC时间:");//找到"RTC时间:"字符
if(strx)
{
get_time(dbuf); //得到时间  
strncpy(strx+33,(const char*)dbuf,16); //更新时间
}
strncpy(s->filename, http_index_html, sizeof(s->filename));
}else //如果不是' '/'?'
{
s->inputbuf[PSOCK_DATALEN(&s->sin)-1] = 0;
strncpy(s->filename,&s->inputbuf[0],sizeof(s->filename));
}   
s->state = STATE_OUTPUT;    
while(1) 
{
PSOCK_READTO(&s->sin, ISO_nl);
if(strncmp(s->inputbuf, http_referer, 8) == 0) 
{
s->inputbuf[PSOCK_DATALEN(&s->sin) - 2] = 0;   
}
}    
PSOCK_END(&s->sin);
}
这部分代码中,是处理输入数据的,比如接收到的数据是把LED0灭掉,会更新网页显示的图片使其变成灰色,并显示“灭”字,同时更新时间和温度。那我想问了strx=strstr((const char*)(data_index_html+13),"℃");//在数组里找到"℃"字符后,又调用strncpy(strx-4,(const char*)dbuf,4); 我知道是把dbuf里的数据copy到strx-4的地址里边去了,但怎么会更新到data_index_html[]里边去的呢?这样是怎么实现网页显示更新呢?后来也没有出现strx啊?是不是应该有strcpy(data_index_html,str,sizeof())这样的语句?

实际上,这是c语言的指针地址的关系。

int *p;//定义一个指针P

int a=10;//定义一个变量a赋初值10

p=&a;//&是求地址运算符  将a的地址赋给p  p指向a的首地址,如果p指向数组 那么p就是数组的首地址 strx=&data_index_html;

*p=20;//那么*p就是a 

printf("%s",a);打印输出20.

P是指针,那么*p就是内容。

 下面看vc打印

 

int main()
{

char *strx;

unsigned char data_index_html[]={"1234567890abcdefg"};

strx=strstr((const char*)(data_index_html+2),"a");  //寻找a出现在data_index_html的位置 并返回其首地址
  printf("%s\n",strx);//打印data_index_html的首地址 并以流形式 输出知道遇到\0结束
  printf("%c\n",*strx); //打印内容 只打印一个首地址所在的内容
  printf("%c\n",*strx+1);
    printf("%c\n",*strx+2);
if(strx)
{
strncpy(strx+2,"MY",2); 

}  
  printf("%s\n",data_index_html);  
}

100.jpg

这样就不难理解,index_html_data打印的数据,因为他是通过改变地址来改变的数据。

延伸拓展

在c语言中,strstr()函数返回就是地址。

最新评论

  1. 路过
    发布于:2015-01-05 10:03 回复
    吼吼
    1. 发布于:2015-01-10 10:58 回复
      @路过:谢谢

sitemap