2

嗨,我在 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

谢谢你,如果你能帮助我理解为什么我可能会得到这个。

编辑

我正在传递的话->myprog CS800 is good fun

4

3 回答 3

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],“good”的首字母;

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] 不同。换句话说,你的两个程序的名称不同。

于 2013-05-22T14:08:44.813 回答
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;
}
于 2013-05-22T13:30:58.317 回答
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 */
于 2013-05-22T14:03:08.037 回答