首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

求问如次代码中的这句话是什么意思:filename[len]=0

2013-09-11 
求问如下代码中的这句话是什么意思:filename[len]0本帖最后由 yangxuefeng09 于 2013-09-05 15:41:37 编

求问如下代码中的这句话是什么意思:filename[len]=0;
本帖最后由 yangxuefeng09 于 2013-09-05 15:41:37 编辑

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
main()
{
int sfd,cfd,ffd;
int r;
int len;
char buf[128];
char filename[100];
struct sockaddr_in dr;
//1.建立服务器socket
sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd==-1) printf("1:%m\n"),exit(-1);
printf("建立服务器成功!\n");
//2.绑定IP地址与端口
dr.sin_family=AF_INET;
dr.sin_port=htons(9988);
dr.sin_addr.s_addr=inet_addr("192.168.180.92");
r=bind(sfd,(struct sockaddr*)&dr,sizeof(dr));
if(r==-1) printf("2:%m\n"),close(sfd),exit(-1);
printf("绑定地址成功!\n");
//3.监听
r=listen(sfd,10);
if(r==-1) printf("3:%m\n"),close(sfd),exit(-1);
printf("监听成功!\n");
//4.接收连接
cfd=accept(sfd,0,0);
if(cfd==-1) printf("4:%m\n"),close(sfd),exit(-1);
printf("开始接收文件!\n");
//5.接收文件名
r=recv(cfd,&len,sizeof(len),MSG_WAITALL);
printf("文件名长度:%d\n",len);
r=recv(cfd,filename,len,MSG_WAITALL);
filename[len]=0;
/*
请问谁能告诉我:filename[len]=0;这句话到底是什么意思
(1)是把一段字符串的最后一个位置上面写入‘\0’的意思那
(2)还是把整个的filename[len]长度的内存空间中的数据全部设置成0啊???

我认为是第一个也就是(1)是把一段字符串的最后一个位置上面写入‘\0’的意思那
但是为什么下面的这个链接上面的网页,他们认为是第二个啊 ????
http://blog.sina.com.cn/s/blog_7057cef40100q3op.html


*/
printf("传递的文件名是:%s\n",filename);
//6.创建文件
ffd=open(filename,O_RDWR|O_CREAT,0666);
//7.循环接收文件数据
while(1)
{
r=recv(cfd,&len,sizeof(len),MSG_WAITALL);
if(len==0) break;
r=recv(cfd,buf,len,MSG_WAITALL);

write(ffd,buf,len);

}
close(ffd);
close(cfd);
close(sfd);
printf("接收文件完毕!\n");
}
c
[解决办法]
将字符串的末尾置0;就是字符串结束符啊。
[解决办法]

//我也是这样认为的第一种
//是把一段字符串的最后一个位置上面写入‘\0’的意思


[解决办法]
没看代码
filename[len]=0 
这句的意思是前面 0到len-1的字符数组是文件名,len下标放一个'\0'结束符。不然没结束符,用的时候会越界。

[解决办法]

引用:

//我也是这样认为的第一种
//是把一段字符串的最后一个位置上面写入‘\0’的意思



char filename[10] = {0}; //初始化,所有的字节为0,
char filename = '\0'; // 只有一个字节,清空为0

 filename[10] = 0;   //这是一个赋值操作,把最后一个为0,字符串结束符!防止输出垃圾字符!

[解决办法]
确实是第一个。。。
[解决办法]
。。。看文章能仔细点么?char str1[10] = {0},别人说的是这个好么?
[解决办法]
“变量赋值”和“变量初始化”不是一回事!
“变量赋值”发生在运行期,其写法遵循赋值语法规定。
“变量初始化”发生在编译期或运行期,其写法遵循初始化列表语法规定。

[解决办法]
没错, 是第(1)个意思, 就是把一段字符串的最后一个位置上面写入‘\0’这个字符串结尾符,  '\0'的asc码就是0, 所以filename[len]=0; 等价于 filename[len]='\0';

至于你说的那个链接, 这俩根本不是一回事呀
filename[len]=0是给数组的下标为len的那个元素赋值成0
char str[10] = {0}是声明并直接初始化一个数组, 这俩压根没关系的两个东西呀..
[解决办法]
末尾加上\0就是最后一个字节直接等于0
[解决办法]
引用:
将字符串的末尾置0;就是字符串结束符啊。


++
[解决办法]
引用:
Quote: 引用:


//我也是这样认为的第一种
//是把一段字符串的最后一个位置上面写入‘\0’的意思



char filename[10] = {0}; //初始化,所有的字节为0,
char filename = '\0'; // 只有一个字节,清空为0

 filename[10] = 0;   //这是一个赋值操作,把最后一个为0,字符串结束符!防止输出垃圾字符!


这个正解。。
[解决办法]
filename[len] = 0;
就是加结束符!

引用:
Quote: 引用:

Quote: 引用:


//我也是这样认为的第一种
//是把一段字符串的最后一个位置上面写入‘\0’的意思



char filename[10] = {0}; //初始化,所有的字节为0,
char filename = '\0'; // 只有一个字节,清空为0

 filename[10] = 0;   //这是一个赋值操作,把最后一个为0,字符串结束符!防止输出垃圾字符!


这个正解。。

[解决办法]
引用:
Quote: 引用:

Quote: 引用:


//我也是这样认为的第一种
//是把一段字符串的最后一个位置上面写入‘\0’的意思



char filename[10] = {0}; //初始化,所有的字节为0,
char filename = '\0'; // 只有一个字节,清空为0

 filename[10] = 0;   //这是一个赋值操作,把最后一个为0,字符串结束符!防止输出垃圾字符!


这个正解。。
这个正解
[解决办法]
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

热点排行