-2

所以我写了这个小程序,我是新手。它打印出我给它的命令行参数。我只是不明白为什么在我将 i 变量初始化为一个之前它会起作用,但是当我改变它时,我得到了一个分段错误。

编码:

#include<stdio.h>

int main ( int argc, char *argv[] )
{

    if ( argc > 1) {
        printf( "Filename: %s has %d arguments.",  argv[0], argc );
    } else  {
        printf ("No arguments found!");
        getchar();  
        return 0;
    }

    int i = 1;
    printf( "The arguments are: \n" );
    for ( i < argc; ++i;) {
        printf( "Argument %d is: %s \n", i, argv[i] );
    } 

    getchar();
    return 0;
}

我从来没有见过任何说明命令行参数一旦使用就会发生什么的事情。然而,我的假设是在我对它们使用 printf() 之后,命令行参数发生了一些事情。当计数器变量 i 初始化为零时,它第一次起作用。当我通过将 i 初始化为 1 来重组程序以跳过零 eth 时,参数给了我该分段错误。我这样做是因为我对正在发生的事情有点困惑。它没有像我想象的那样第二次打印出文件名,但我改变了它,所以无论如何它都不会(很有意义吧?不是回想起来哈哈)。

4

3 回答 3

2

您的 for 循环已损坏:

for(;i<argc;++i)

第一个块是初始条件,第二个块是每次迭代前执行的检查。正如你写的那样,检查是 ++i ,即使在最后一个参数之后也是如此。

于 2013-07-25T15:25:16.870 回答
0

使用 for...next 循环的正确方法是这样的(对于 C 1990/1989):

   int i;
   printf( "The arguments are: \n" );
   for ( i = 0; i < argc; i++) {

许多人抱怨我对语法缺乏了解。我确实知道如何编写一个 for...next 循环。我用 C++ 写过很多东西,C 几乎没有什么不同。我遵循了编译器的警告并进行了调整,但并没有真正考虑我在做什么或检查是否有其他人有同样的问题。

因为我使用 GCC 的编译器不完全支持 C99,所以我选择坚持使用 C90 作为我的编译选项。我只是在学习 C,我发现它很像 C++(很喜欢),但我并没有声称对 C 或其以前的版本一无所知。

于 2013-07-25T21:41:26.270 回答
-1

如果您正在使用 C,您应该首先初始化声明并初始化 i,如果您更改 int i = 1 的位置,您的程序是否可以正常工作

于 2013-07-25T15:24:23.113 回答