| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1256 人关注过本帖
标题:有些代码看不懂
只看楼主 加入收藏
米兰的大铁匠
Rank: 2
来 自:天外
等 级:论坛游民
帖 子:61
专家分:84
注 册:2013-7-16
结帖率:83.33%
收藏
已结贴  问题点数:30 回复次数:11 
有些代码看不懂
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

#define oops(m) do{perror(m); exit(1);}while(0)

int main()
{
char buf[32];
int pid = 0;
int num = 0;
int i = 0;
int flag = 0;
char * p = NULL;

while (1)
{
flag = 0;
i = 0;
num = 0;

printf("Please input a cmd: ");
fgets(buf, 32, stdin);

if (strncmp(buf, "end", 3) == 0)
break;

p = strstr(buf, "\n");
if (p != NULL)
*p = '\0';

while (buf[i] != '\0')
{
if (buf[i] == ' ' && buf[i+1] != ' ')
{
num++;//这里不懂
flag = 1;//还有这里,所谓的标记,是什么意思
}
else
flag = 0;//???

i++;
}

char* argv[num+2];// 为什么又是+2
argv[num+1] = NULL;

p = buf;
for (i = 0; i < num+1; i++)
{
argv[i] = p;
p = strstr(p, " ");

if (p == NULL)
break;

while (*p == ' ' && *(p+1) == ' ')
{   
*p = '\0';
p++;
}   
*p = '\0';
p++;
}

pid = fork();
if (pid == -1)
{
oops("fork");
}
else if (pid == 0)
{
execvp(argv[0], argv);
perror("execvp");
}

wait(NULL);
}


return 0;
}


其他的都还懂
搜索更多相关主题的帖子: include 
2013-09-26 21:34
米兰的大铁匠
Rank: 2
来 自:天外
等 级:论坛游民
帖 子:61
专家分:84
注 册:2013-7-16
收藏
得分:0 
求高手指教,注释部分不懂,其它的都还好
2013-09-26 21:39
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
收藏
得分:4 
把看懂得理解到位就很好了!

♂ 死后定当长眠,生前何须久睡。♀
2013-09-26 21:57
米兰的大铁匠
Rank: 2
来 自:天外
等 级:论坛游民
帖 子:61
专家分:84
注 册:2013-7-16
收藏
得分:0 
以下是引用303770957在2013-9-26 21:57:12的发言:

把看懂得理解到位就很好了!
问题是那些不懂的,使得整个代码不连贯
2013-09-26 22:24
Explorerlxz
Rank: 9Rank: 9Rank: 9
来 自:zzu
等 级:蜘蛛侠
威 望:4
帖 子:302
专家分:1032
注 册:2013-4-24
收藏
得分:4 
MARK一下!!明天看!很有意思啊,好多头文件我都没见过,不过程序涉及命令行,我还是挺感兴趣的!
2013-09-26 23:35
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:4 
百度找找头文件的概念

思考赐予新生,时间在于定义
2013-09-26 23:37
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:4 
既然不带参数运行,就不要用argv了,容易误导

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2013-09-27 06:53
小小程序猿
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:1
帖 子:755
专家分:2785
注 册:2013-7-18
收藏
得分:4 
能看懂多少看多少

看不懂的找书学呗,一俩句说不清

孤独与寂寞是催化一个人迅速成长的良药,没有之一
2013-09-27 10:12
loveClangage
Rank: 8Rank: 8
来 自:广东云浮
等 级:蝙蝠侠
帖 子:326
专家分:891
注 册:2013-8-23
收藏
得分:4 
这样说不懂,别人很难帮你的,因为不知你有什么基础和不懂哪些吧,

编写的程序,不能改变世界,却可以改变自己...
2013-09-27 15:40
toofunny
Rank: 4
等 级:业余侠客
帖 子:71
专家分:200
注 册:2012-7-22
收藏
得分:4 
这代码乱得一团糟,你看不懂也怪不得你的。下面是针对你看不懂的地方的注释,希望能帮到你。
int main()
{
char buf[32];
int pid = 0;
int num = 0;
int i = 0;
int flag = 0;
char * p = NULL;

while (1)
{
flag = 0;
i = 0;
num = 0;

printf("Please input a cmd: ");
fgets(buf, 32, stdin);

if (strncmp(buf, "end", 3) == 0)
break;

p = strstr(buf, "\n");
if (p != NULL)
*p = '\0';

while (buf[i] != '\0')  //这段代码解析输入的命令行
{
if (buf[i] == ' ' && buf[i+1] != ' ') //检测输入的字符串中间是否存在空格
{
num++;//每遇到一个空格,num++ , 表示参数的数量。(第一个空格之前的是命令,后面每段隔开的都是参数)
flag = 1;//如果存在空格,则flag = 1
}
else
flag = 0;//不存在参数

i++;
}

char* argv[num+2];// num是参数的个数,参数加命令,一共是num+1个字符串,多分配一个字符串表示结束
argv[num+1] = NULL;//结束标志

p = buf;
for (i = 0; i < num+1; i++)
{
argv[i] = p;
p = strstr(p, " ");

if (p == NULL)
break;

while (*p == ' ' && *(p+1) == ' ')
{   
*p = '\0';
p++;
}   
*p = '\0';
p++;
}

pid = fork();
if (pid == -1)
{
oops("fork");
}
else if (pid == 0)
{
execvp(argv[0], argv);
perror("execvp");
}

wait(NULL);
}


return 0;
}



2013-09-27 22:38
快速回复:有些代码看不懂
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023183 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved