您好我在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
答案 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 */