我无法弄清楚为什么以下代码中的任何一个无法按预期运行。 两者都编译成执行文件。
输出:
a.out , prints 1, expected "no value"
a.out 1, prints 2, expected 1
a.out 2, prints 2, expected 2
使用案例:
void main(int in)
{
int a = in ;
printf("In function if\n");
if ( in == 1 )
printf("1\n");
else
if ( in == 2)
printf("2\n");
else
printf("wrong value\n");
}
使用开关:
void main(int in)
{
switch( in )
{
case 1: printf("1\n"); break;
case 2: printf("2\n"); break;
default: printf("wrong value\n"); break;
}
};
我试图在C代码中获得以下LISP功能:
(cond ((= in 1) 1)
((= in 2) 2)
(t nil))
感谢您的协助。
答案 0 :(得分:7)
main
不接受来自命令行的输入作为直接参数,如果没有参数,那么你得到的参数计数为1
,2
如果有一个参数,则会导致奇怪的行为。
main
应定义为int main( int argc, char *argv[] )
或类似内容。要获取输入,您需要首先通过测试argc
(参数计数,加上可执行路径的一个)来检查它是否存在,然后将argv[1]
转换为整数。 atoi可用于将字符串转换为整数。
答案 1 :(得分:2)
请注意,main
的第一个参数是argc
,即命令行中给出的应用名称+参数总数。 main
上有第二个参数,char *argv[]
用于接收命令行参数。
您获得所述行为的原因是您的参数in
取代了argc
的目的。即,当你执行没有命令行参数的应用程序时,argc
计数为1,有一个参数,它将是2,等等 - 这是传递给in
的值。由于命令行参数(main
)没有第二个argv
参数,因此根本不会收到实际参数。
要解决此问题,您需要为args
整数参数解析第二个in
数组:
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc < 2)
return EXIT_FAILURE; // ... print out the correct command line usage to user
char *endPointer = NULL;
long in;
in = strtol(argv[1], &endPointer, 10);
if (endPointer != NULL) {
switch( in ) {
case 1:
// ... same code as above
}
return EXIT_SUCCESS;
}
return EXIT_FAILURE; // User hasn't provided a number for 1st param
}