【问题标题】:What happens to command line arguments once printf() is used on them?对命令行参数使用 printf() 后会发生什么情况?
【发布时间】:2013-07-26 05:41:26
【问题描述】:

所以我写了这个小程序,我是新手。它打印出我给它的命令行参数。我只是不明白为什么在我将 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 时,参数给了我该分段错误。我这样做是因为我对正在发生的事情有点困惑。它没有像我想象的那样第二次打印出文件名,但我改变了它,所以它无论如何都不会(很有意义吧?不是回想起来哈哈)。

【问题讨论】:

  • 您已经在 for 循环的“初始化”部分编写了测试;您已将增量用作测试(因此循环将一直运行,直到 i 增量为零,这将需要很长时间(或在您访问无效内存时使程序崩溃);然后重新初始化子句是空的。你需要for (int i = 1; i &lt; argc; i++),或多或少就像 Nirk 所说的那样。
  • 当一个人甚至不知道语法时,所需的“最低限度的理解”在哪里?
  • @H2CO3:语法是正确的(在允许和可编译的情况下)。语法的语义是错误的。
  • @JonathanLeffler 确实如此。我的意思是。仍然缺少“最低限度的理解”。
  • 初学者错误;很容易制作。如果您从未犯过任何模糊的类似错误,请举手……其中一个更有趣的问题(早在标准 C 出现之前的日子,所以没有原型)是一个启动 int main(char **argv, int argc) 的程序。一旦你发现它,它就是微不足道的——但有argcargv。诚然,那是我所教班级的一名学生,但我花了一两分钟才发现问题。

标签: c command-line-arguments


【解决方案1】:

你的 for 循环坏了:

for(;i<argc;++i)

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

【讨论】:

    【解决方案2】:

    使用 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 或其以前的版本一无所知。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 不是我的反对票,而是因为 C99 和 C11 都允许 int i = 1; 在其中写入。只有仅支持 C89 的过时编译器(如 MSVC)不支持在其编写处声明 i
      • 如果他将 int i = 1; 移动到 C89 允许的地方,我看不出程序将如何正常工作
      • 它工作正常并且在VS2010上没有崩溃,我不得不说我没有给出参数!
      猜你喜欢
      • 2011-03-01
      • 2011-11-20
      • 1970-01-01
      • 2011-10-15
      • 2011-02-02
      • 1970-01-01
      • 2015-12-04
      • 2023-03-30
      • 2015-03-14
      相关资源
      最近更新 更多