【发布时间】: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 < argc; i++),或多或少就像 Nirk 所说的那样。 -
当一个人甚至不知道语法时,所需的“最低限度的理解”在哪里?
-
@H2CO3:语法是正确的(在允许和可编译的情况下)。语法的语义是错误的。
-
@JonathanLeffler 确实如此。我的意思是。仍然缺少“最低限度的理解”。
-
初学者错误;很容易制作。如果您从未犯过任何模糊的类似错误,请举手……其中一个更有趣的问题(早在标准 C 出现之前的日子,所以没有原型)是一个启动
int main(char **argv, int argc)的程序。一旦你发现它,它就是微不足道的——但有argc和argv。诚然,那是我所教班级的一名学生,但我花了一两分钟才发现问题。