Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中逐字符打印命令行参数_C_Arrays_Pointers_Command Line_Char - Fatal编程技术网

在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