通过argv语句的不同答案

时间:2013-05-22 12:28:26

标签: c xcode eclipse

您好我在Eclipse上运行此操作并且无法在测试中获得答案;

fun is good
my food
2 x 4 = 8

来自测试的代码。

    #include<stdio.h>
    #include<stdlib.h>
    #include <string.h>

    int main(int argc, char **argv)
    {
    printf("%s %s %s\n", argv[4], argv[2], argv[3]);
    printf("%c%c %c%s\n", **argv, (*argv)[1], *argv[4], argv[3] + 1);
    printf("%d x %d = %c", strlen(*argv + 2), argc - 1, *(*(argv+1)+2));
    return EXIT_SUCCESS;
    }

在日食中我得到了:

good CS800 is
/U gs
51 x 5 = p

在Xcode中我得到了:

good CS800 is
/U gs
118 x 5 = p

谢谢你,如果你能帮我理解为什么我会这样做。

修改

我传递的话 - &gt; myprog CS800 is good fun

3 个答案:

答案 0 :(得分:2)

简单,你可以看到array [i] [j]为*(*(array + i)+ j),它们是相同的。它取决于哪种情况更易于理解。

而且,作为运算符,[]的优先级高于*。

第一行易于开发。忽略。

第二行:

printf("%c%c %c%s\n", **argv, (*argv)[1], *argv[4], argv[3] + 1);

** argv是argv [0] [0],是你程序名称的第一个字母;

(* argv)[1]是argv [0] [1],是程序名称的第二个字母;

* argv [4]是argv [4] [0],“好”的第一个字母;

argv [3] + 1是指向argv [3] [1]的指针,但%s将其转换为字符串,实际上是“s \ 0”。

让我们看看第三行。

printf("%d x %d = %c", strlen(*argv + 2), argc - 1, *(*(argv+1)+2));

argc -1为6 -1,结果为5;

*(*(argv + 1)+2))是argv [1] [2],字母“p”;

* argv是argv [0],它是一个指向字符串的指针,* argv + 2将是一个以argv开头的字符串。如果strlen(argv [0])大于2,则strlen(* argv + 2)等于strlen(argv [0])。

所以我认为两个输出之间的区别是因为argv [0]不同。换句话说,两个程序的名称是不同的。

答案 1 :(得分:1)

argv [0]是您的程序的名称,所以这是他们在您的示例中的内容:

argv [0] =您的可执行文件的名称

argv [1] =“myprog”

argv [2] =“CS800”

argv [3] =“是”

argv [4] =“好”

argv [5] =“有趣”

因此您需要将所有数字增加1,例如改变:

printf("%s %s %s\n", argv[4], argv[2], argv[3]);

为:

printf("%s %s %s\n", argv[5], argv[3], argv[4]);

编辑:我没有测试过,但尝试:

#include<stdio.h>
#include<stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{
printf("%s %s %s\n", argv[5], argv[3], argv[4]);
printf("%c%c %c%s\n", *(*(argv+1)), (*(argv+1))[1], *argv[5], argv[4] + 1);
printf("%d x %d = %c", strlen(*(argv + 3)), argc - 2, *(*(argv+2)+2));
return EXIT_SUCCESS;
}

答案 2 :(得分:0)

好吧我设法解决了这个问题,但只是因为第一个代码应该有效,如果以某种方式传递argv [0]。 但为了得到结果我做了这个:

/* printf("%s %s %s\n", argv[4], argv[2], argv[3]); */
/* became */
printf("%s %s %s\n", argv[5], argv[3], argv[4]);

/* printf("%c%c %c%s\n", **argv, (*argv)[1], *argv[4], argv[3] + 1); */
/* became */
printf("%c%c %c%s\n", **(argv + 1), (*(argv+1))[1], *argv[5], argv[4] + 1);

/* printf("%d x %d = %c", strlen(*argv + 2), argc - 1, *(*(argv+1)+2)); */
/* became */
printf("%d x %d = %c", strlen(*(argv+4)), argc - 2, *(*(argv+2)+2));
                          /* this I added 4 to argv */