在C中逐字符打印命令行参数
以下是我所拥有的:在C中逐字符打印命令行参数,c,arrays,pointers,command-line,char,C,Arrays,Pointers,Command Line,Char,以下是我所拥有的: #include <stdlib.h> #include <string.h> #include <stdio.h> int main(int argc, char **argv) { while(*argv++ != 0) { printf("Argument!\n"); printf("%s %d\n",*argv,(int)strlen(*argv));
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main(int argc, char **argv)
{
while(*argv++ != 0)
{
printf("Argument!\n");
printf("%s %d\n",*argv,(int)strlen(*argv));
int i = 0;
while(*argv[i])
{
printf("char!\n");
printf("%c\n",*argv[i]);
i++;
}
printf("End of for loop\n");
}
return 0;
}
我已经盯着这个看了几个小时了。为什么我的程序不逐字打印每个命令行参数
我对C语言和数组指针二元性还不熟悉,所以如果这就是问题所在,我也不会感到惊讶。感谢您的帮助 试试这个:
while(argv) {
printf("%s\n", *argv); /* %s instead of %c and drop [i]. */
argv++; /* Next arg. */
}
当您说*argv[i]
时,如果argv[i]
为空,它将由于明显的原因而失败
你不应该跟随空指针,因为混乱和疯狂在它的尽头等待着你。试试以下方法:
while(argv) {
printf("%s\n", *argv); /* %s instead of %c and drop [i]. */
argv++; /* Next arg. */
}
当您说*argv[i]
时,如果argv[i]
为空,它将由于明显的原因而失败
你不应该跟随空指针,因为混乱和疯狂在它的尽头等待着你。第一版
您需要的是使用argc:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main(int argc, char **argv)
{
int i = 0;
int j = 0;
for (i = 0; i < argc; i ++)
{
j = 0;
while(argv[i][j] != '\0')
printf("Argument %d letter %d : %c\n", i,j,argv[i][j++]);
}
return 0;
}
第二版:
您可以对j
使用指针表示法,但不能对i
使用指针表示法,因为您不知道每个参数的字母计数。当然,这可以通过使用strlen来实现,这将导致在引擎盖下通过字符串进行迭代来计算字母,这不是您想要做的。如果你可以在一次迭代中完成,为什么要在两次迭代中完成呢
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main(int argc, char **argv)
{
int i = 0;int j = 0;
while(i < argc)
{
j=0;
while(*(argv[i]+j) != '\0')
{
printf("Argument %d letter %d : %c\n", i,j,*(argv[i]+(j)));
j++;
}
i++;
}
return 0;
}
#包括
#包括
#包括
int main(int argc,字符**argv)
{
int i=0;int j=0;
而(i
第一版
您需要的是使用argc:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main(int argc, char **argv)
{
int i = 0;
int j = 0;
for (i = 0; i < argc; i ++)
{
j = 0;
while(argv[i][j] != '\0')
printf("Argument %d letter %d : %c\n", i,j,argv[i][j++]);
}
return 0;
}
第二版:
您可以对j
使用指针表示法,但不能对i
使用指针表示法,因为您不知道每个参数的字母计数。当然,这可以通过使用strlen来实现,这将导致在引擎盖下通过字符串进行迭代来计算字母,这不是您想要做的。如果你可以在一次迭代中完成,为什么要在两次迭代中完成呢
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main(int argc, char **argv)
{
int i = 0;int j = 0;
while(i < argc)
{
j=0;
while(*(argv[i]+j) != '\0')
{
printf("Argument %d letter %d : %c\n", i,j,*(argv[i]+(j)));
j++;
}
i++;
}
return 0;
}
#包括
#包括
#包括
int main(int argc,字符**argv)
{
int i=0;int j=0;
而(i
您有两个问题。第一,在外部while
循环的每次迭代开始时,递增argv
以指向下一个字符串。当到达最后一个参数时,argv
将NULL
进入最后一次迭代,当您取消引用它时,它将出错
其次,在内部循环中,操作顺序是混合的*argv[i]
索引到argv
中,然后取消引用它,从当前索引开始,取i
th字符串的第一个字符。当i
超过剩余参数的数量时,这也将导致segfault
将外部循环重写为while(*++argv))
(++argv
周围的括号是可选的,但很有用),以便argv
在空检查之前递增;如果还想打印程序名(在argv[0]
中),则将增量移到循环的末尾,而不是循环条件中
将内部循环重写为
while((*argv)[i])
,并将内部printf
语句重写为也使用(*argv)[i]
,以便取消引用当前参数,然后按该顺序将其编入索引。您有两个问题。第一,在外部while
循环的每次迭代开始时,递增argv
以指向下一个字符串。当到达最后一个参数时,argv
将NULL
进入最后一次迭代,当您取消引用它时,它将出错
其次,在内部循环中,操作顺序是混合的*argv[i]
索引到argv
中,然后取消引用它,从当前索引开始,取i
th字符串的第一个字符。当i
超过剩余参数的数量时,这也将导致segfault
将外部循环重写为while(*++argv))
(++argv
周围的括号是可选的,但很有用),以便argv
在空检查之前递增;如果还想打印程序名(在argv[0]
中),则将增量移到循环的末尾,而不是循环条件中
将您的内部循环重写为
while((*argv)[i])
,并将内部printf
语句重写为也使用(*argv)[i]
,以便当前参数被取消引用,然后按该顺序编入索引。您将通过研究找到答案
argv
听起来不是个好主意。制作一份副本并按你的意愿使用它argv
将在某个点指向0
*argv[i]
这样的东西非常难读:是吗
(*argv[i]
,或*(argv[i])
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main(int argc, char **argv)
{
char **currentArgv = argv;
int currentArgc = 0;
while(++currentArgc < argc)
{
printf("Argument!\n");
printf("%s %d\n",currentArgv[currentArgc],(int)strlen(currentArgv[currentArgc]));
int i = 0;
while(currentArgv[currentArgc][i]!='\0')
{
printf("char!\n");
printf("%c\n",currentArgv[currentArgc][i]);
i++;
}
printf("End of for loop\n");
}
return 0;
}
#包括
#包括
#包括
int main(int argc,字符**argv)
{
字符**当前argv=argv;
int currentArgc=0;
而(++当前argc