int main(int argc, char* argv[])
{
int i,s;
s=0;
char*p;
for(i=1; i<argc;i++)
{
for (p=argv[i];*p;p++);
s+=(p-argv[i]);
}
printf("%d\n",s);
return 0;
}
我很难理解这段代码的作用。
据我所知,它忽略了程序的名称,并且对于在命令行中打印的每个其他字符串,它将p
设置为当前字符串。
*p
说“只要它不是p
就行NULL
,即直到你到达字符串的末尾?s
将当前p
(字的其余部分)的减法与argv[i]
的名称相加,此减法的结果是什么?这是两个ascii值的减法吗?答案 0 :(得分:2)
回答这个问题的关键是理解这个表达的含义:
p-argv[i]
这是一个指针减法表达式,它被定义为第一个和第二个指针之间指针所指向的元素大小的距离。当两个指针都指向一个已分配为连续块的内存区域时(这对于所有C字符串一般都是正确的,特别是argv[]
的元素),这是有效的。
指针p
首先进入字符串的末尾(注意循环末尾的分号;
,这意味着循环体是空的),然后{{1减去。结果是相应参数的长度。
答案 1 :(得分:1)
此代码计算程序
的参数长度(作为字符串)的总和答案 2 :(得分:1)
它告诉您传递给程序的所有参数的总字符串长度。
在你的观点(2)中,它只是用包含\0
字符的地址减去字符串的起始地址
答案 3 :(得分:0)
它以向后类型的方式使用指针地址来计算所有参数中的总字符数。
for (p=argv[i];*p;p++); //sets p to the address of argv[i]'s \0 terminator
s+=(p-argv[i]); // p minus the address of the start of argv[i] accumulated to s