关于argv和argc求教

温小二的徐凤年 2015-12-18 02:30:24
最近忽然看到linux的mkimage的源码。看到一行不懂了,就过来求教了,求大神解释:
具体如下:
main (int argc, char **argv)
{
...................
while (--argc > 0 && **++argv == '-') {
while (*++*argv) {
switch (**argv) {
case 'l':
lflag = 1;
break;
case 'A':
if ((--argc <= 0) ||
(opt_arch = get_arch(*++argv)) < 0)
usage ();
.....................


}
while(--argc > 0 && **++argv == '-')判断参数是否有输入以及是不是- ,但是下面那个while就不懂了,求教:
while (*++*argv)
...全文
169 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
猪头三小队长 2015-12-18
  • 打赏
  • 举报
回复
三楼说的对,不过这种写法有点无语,既然都用到fprintf了,用个getopt也不会死人。
常书 2015-12-18
  • 打赏
  • 举报
回复
遍历每一个串第二个字符开始的每个字符

int i,j;
	char argv[5][6]={{0x30,0x30,0x30,0x30,0x30,0x30},{0x31,0x31,0x31,0x31,0x31,0x31},{0x32,0x32,0x32,0x32,0x32,0x32},
		{0x33,0x33,0x33,0x33,0x33,0x33},{0x0}};	
	char* p[5];
	char** pp=&p[0];
	char* tp;

	for (i=0;i<5;i++)
	{
		p[i]=argv[i];
		printf("p[%d]:%x\r\n",i,p[i]);
	}
	
	tp=p[0];

	while (*++*pp)
	{
		printf("get:%x\r\n",**pp);
	}

	printf("test2\r\n");
	while (*++tp)
	{
		printf("get:%x\r\n",*tp);
	}
mewiteor 2015-12-18
  • 打赏
  • 举报
回复
*argv是char*类型的,也就是一个字符串。 while (--argc > 0 && **++argv == '-') 确保了*argv的第一个字符是'-', while (*++*argv) 就是从*argv的第二个字符开始,直到最后一个字符,这里的++*argv在每次循环中都将*argv的首地址向后移动一位,这样就可以遍历字符串的每个字符。
linzertling 2015-12-18
  • 打赏
  • 举报
回复
这个用法我也没见过,你可以搜搜看是什么
  • 打赏
  • 举报
回复
再贴比较详细的源码
int
main (int argc, char **argv)
{
	int ifd;
	uint32_t checksum;
	uint32_t addr;
	uint32_t ep;
	uint32_t ksz=0;
	struct stat sbuf;
	unsigned char *ptr;
	char *name = "";

	cmdname = *argv;

	addr = ep = 0;
	while (--argc > 0 && **++argv == '-') {
		while (*++*argv) {
			switch (**argv) {
			case 'l':
				lflag = 1;
				break;
			case 'A':
				if ((--argc <= 0) ||
				    (opt_arch = get_arch(*++argv)) < 0)
					usage ();
				goto NXTARG;
			case 'C':
				if ((--argc <= 0) ||
				    (opt_comp = get_comp(*++argv)) < 0)
					usage ();
				goto NXTARG;
			case 'O':
				if ((--argc <= 0) ||
				    (opt_os = get_os(*++argv)) < 0)
					usage ();
				goto NXTARG;
			case 'T':
				if ((--argc <= 0) ||
				    (opt_type = get_type(*++argv)) < 0)
					usage ();
				goto NXTARG;

			case 'a':
				if (--argc <= 0)
					usage ();
				addr = strtoul (*++argv, (char **)&ptr, 16);
				if (*ptr) {
					fprintf (stderr,
						"%s: invalid load address %s\n",
						cmdname, *argv);
					exit (EXIT_FAILURE);
				}
				goto NXTARG;
			case 'd':
				if (--argc <= 0)
					usage ();
				datafile = *++argv;
				dflag = 1;
				goto NXTARG;
			case 'e':
				if (--argc <= 0)
					usage ();
				ep = strtoul (*++argv, (char **)&ptr, 16);
				if (*ptr) {
					fprintf (stderr,
						"%s: invalid entry point %s\n",
						cmdname, *argv);
					exit (EXIT_FAILURE);
				}
				eflag = 1;
				goto NXTARG;
			case 'k':
				if (--argc <= 0)
					usage ();
				ksz = (uint32_t)atoi(*++argv);
				goto NXTARG;
			case 'n':
				if (--argc <= 0)
					usage ();
				name = *++argv;
				goto NXTARG;
			case 'v':
				vflag++;
				break;
			case 'x':
				xflag++;
				break;	
			default:
				usage ();
			}
		}
NXTARG:		;
	}
}

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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