3
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为当前字符串。

  1. 条件*p是“p只要不是,就继续旅行NULL,即直到你到达字符串的末尾?
  2. 在每次迭代s中,将当前 的减法相加p,其余单词的名称为argv[i],这个减法的结果是什么?这是两个ascii值的减法吗?
  3. 这个程序基本上是做什么的?
4

4 回答 4

2

回答这个问题的关键是理解这个表达式的含义:

p-argv[i]

这是一个指针减法表达式,它被定义为指针所指向的元素在第一个和第二个指针之间的距离。当两个指针都指向已分配为连续块的内存区域时,此方法有效(这对于所有 C 字符串通常是正确的argv[],尤其是元素)。

指针p先前进到字符串的末尾(注意;循环末尾的分号,表示循环体为空),然后argv[i]减去。结果是相应参数的长度。

于 2012-07-17T14:07:33.903 回答
1

它告诉您传递给程序的所有参数的总字符串长度。

在您的观点 (2) 中,它只是将字符串的起始地址与包含\0字符的地址相减

于 2012-07-17T14:08:19.617 回答
1

此代码计算程序的参数(作为字符串)长度的总和

于 2012-07-17T14:07:15.573 回答
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
于 2012-07-17T14:13:10.967 回答