命令行参数如何理解?

i945800687 2012-04-09 12:23:15

/* count.c -- using standard I/O */
/* 命令行参数 */
#include <stdio.h>

#include <stdlib.h> // ANSI C exit() prototype
int main(int argc, char *argv[])
{
int ch; // place to store each character as read
// 读取时存储每个字符的位置
FILE *fp; // "file pointer"
// 文件指针
long count = 0;

if (argc != 2)
{
printf("Usage: %s filename\n", argv[0]);
exit(1);
}
if ((fp = fopen(argv[1], "r")) == NULL)
{
printf("Can't open %s\n", argv[1]);
exit(1);
}
while ((ch = getc(fp)) != EOF)
{
putc(ch,stdout); // same as putchar(ch)
count++;
}
fclose(fp);
printf("File %s has %ld characters\n", argv[1], count);

return 0;
}

执行程序:

各位可不可以帮我全程分析一下,每人看几行就可以
我看了几天没搞懂
...全文
183 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
complety 2012-04-09
  • 打赏
  • 举报
回复
这个貌似Unix环境高级编程里面的。main(int argc, char *argv[])。
argc表示参数个数,argv[argc]存储的是每个参数的地址
godmmx 2012-04-09
  • 打赏
  • 举报
回复
不好意思,没有仔细看,应该是打开你指定的文件并统计字符数量并显示。程序分析如2楼

[Quote=引用 1 楼 的回复:]
这个程序有啥好分析的,不就是运行以后后面带一个文件名,你所有敲进去的东西全部保存一下吗,然后打印你敲了多少字符吗。



引用楼主 的回复:
C/C++ code


/* count.c -- using standard I/O */
/* 命令行参数 */
#include <stdio.h>

#include <stdlib.h> // ANSI C exit()……
[/Quote]
godmmx 2012-04-09
  • 打赏
  • 举报
回复
不过为了分数,简单写写吧

/* count.c -- using standard I/O */
/* 命令行参数 */
#include <stdio.h>

#include <stdlib.h> // ANSI C exit() prototype
int main(int argc, char *argv[])
{
int ch; // place to store each character as read
// 读取时存储每个字符的位置
FILE *fp; // "file pointer"
// 文件指针
long count = 0; //用来统计你指定的文件中有多少字符

if (argc != 2) //检查你是不是后面带了参数,为啥是2呢,第一个是你自己的文件名
{
printf("Usage: %s filename\n", argv[0]);//如果不是带了参数就打印一个用法提示
exit(1);//退出
}
if ((fp = fopen(argv[1], "r")) == NULL)//然后打开你指定的那个文件
{
printf("Can't open %s\n", argv[1]);//如果文件不能打开就说不能打开
exit(1);
}
while ((ch = getc(fp)) != EOF)//然后不断取里面的字符,一直到文件结尾
{
putc(ch,stdout); // same as putchar(ch)//输出到标准输出设备上,应该是屏幕上吧
count++;//输出一个字符,统计数就加1
}
fclose(fp);//文件关闭
printf("File %s has %ld characters\n", argv[1], count);//打印一下一共从你指定的文件中读取到多少字符

return 0;//返回
}

godmmx 2012-04-09
  • 打赏
  • 举报
回复
这个程序有啥好分析的,不就是运行以后后面带一个文件名,你所有敲进去的东西全部保存一下吗,然后打印你敲了多少字符吗。


[Quote=引用楼主 的回复:]
C/C++ code


/* count.c -- using standard I/O */
/* 命令行参数 */
#include <stdio.h>

#include <stdlib.h> // ANSI C exit() prototype
int main(int argc, char *argv[])
{
int ch; ……
[/Quote]
i945800687 2012-04-09
  • 打赏
  • 举报
回复
谢谢各位解答,有点眉目了!
northcan 2012-04-09
  • 打赏
  • 举报
回复
int main(int argc, char *argv[])
{

}

argc是命令行参数的个数,argv是一个数组,数组元素的类型是字符串指针char *。
数组argv的每一个元素存储着一个命令行参数。

你的图看不到,在csdn里面发帖,图片要先上传到csdn的相册里。

从你的代码看,实际运行程序的时候,argv[0]存储的是程序名,
argv[1]存储的参数作为文件名filename。

if (argc != 2)
{
printf("Usage: %s filename\n", argv[0]);
exit(1);
}

这块代码是用来判断输入的参数个数,如果不等于2(程序名+文件名,一共需要2个参数),
说明没有正确输入命令行参数,程序退出。

if ((fp = fopen(argv[1], "r")) == NULL)
{
printf("Can't open %s\n", argv[1]);
exit(1);
}

上面说到argv[1]存储的参数作为文件名filename,所以这块代码打开这个文件,
如果打开失败,则程序退出。

while ((ch = getc(fp)) != EOF)
{
putc(ch,stdout); // same as putchar(ch)
count++;
}

从打开的文件中,循环读入每一个字符,然后输出到标准输出stdout,通常是屏幕。
并计数,所以循环结束后count变量中存储的是文件中的字符总数。

fclose(fp);
printf("File %s has %ld characters\n", argv[1], count);

最后关闭文件指针,释放资源,同时将argv[1]代表的文件中包含的字符总数,
通过printf函数输出。



x363635334 2012-04-09
  • 打赏
  • 举报
回复
//数组大小为argc+1: argv[0]为路径和文件名,argv[1]~argv[argc-1]为参数指针且argv[argc]=NULL
main(int argc,char **argv)
{
printf("%d个参数: ",argc);
while(argc-->1)
printf("%s ",*++argv);
}
声明方式可以有不同
赵4老师 2012-04-09
  • 打赏
  • 举报
回复
for (int i=0;i<argc;i++) printf("%d [%s]\n",i,argv[i]);

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧