【问题标题】:Explain the output of this program?解释这个程序的输出?
【发布时间】:2013-08-13 05:28:06
【问题描述】:

以下程序的输出是什么,如果我们通过命令行向它传递以下参数:

bcd abcd ab abc

那么,既然我们传递了 4 个参数,argc 是 4? 我们将 i 初始化为 2,然后检查 argv 从 1 到 3 - 我的猜测是我们添加 i = 2,然后在下一次迭代中 i = 3,这是 5,所以输出将是5?

void main(int argc, char* argv[])
{
    char *p, *q; 
    int i = 2, j = 0, k = 0; 

    for (; i < argc; i++)
    {
        p = argv[i-1];
        q = argv[i];

        for (j = 0; *q && *p; j++, p++, q++)
        {
            if (*p != *q)
            {
                break;
            } 
        }

        if (!*p || !*q)
        {
            k += i; 
        }
    } 

    printf("%d",k); 
}

【问题讨论】:

  • int main,而不是void main

标签: c argv argc


【解决方案1】:

argc 是 5。

这个程序检查每对连续的参数并计算有多少是彼此的子字符串(第一个是第二个的子字符串,反之亦然):

bcd abcd // i = 2
abcd ab  // i = 3, good
ab abc   // i = 4, good

在这种情况下,由于 i=3i=4 符合条件,k 为 7。

分解代码,如果有不同的字符或一个字符串结束,则最里面的 for 循环退出。仅当其中一个字符串结束时,if (!*p || !*q) k += i; 行才会增加 k

【讨论】:

  • 你能解释一下为什么 argc 是 5 而不是 4 吗?什么是 argv[0]?
  • 因为程序名是参数1
  • @Nicholas 第一个参数 (argv[0]) 将始终是调用的程序名称。要看到这一点,只需创建一个执行printf("%s\n", argv[0]); 的程序,然后直接运行它。之后,将其移动到您的路径中并调用它。
  • @Nicholas 是的,实际的程序参数是argv[1], argv[2], ...。遍历参数的方式是for(i=1;i!=argc;++i)
  • 程序名称是argv[0]。有些人将第一个参数视为程序名称之后的第一个参数,如foo 1 2 3。其他人将foo 视为第一个参数。一定是它们被称为参数的原因。
【解决方案2】:
Can you explain why is argc 5, and not 4? and what would be argv[0]? 

argv[0] 是您程序的名称。像a.out 或其他你命名的东西。 argv[1] ... 是您传递给程序的参数。所以argc1+ paramNumberYouPassed.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多