首先,我必须说我是C编程的新手。我要做的是编写一个程序,该程序接受参数输入并将其转换为整数然后返回其值。我的代码如下所示:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{
int fromArgv = NULL; /* holds value from argv[1] */
fromArgv = atoi (argv[1]); /* convert argv[1] to int */
/* if incorrect no. of arguments entered */
if (argc != 2) {
fprintf (stderr, "error: wrong number of arguments\n");
exit (EXIT_FAILURE);
}
return fromArgv;
}
尝试编译时出现以下错误:
ex1.c: In function ‘main’:
ex1.c:6:18: error: initialization makes integer from pointer without a cast [-Werror]
cc1: all warnings being treated as errors
答案 0 :(得分:5)
你的问题就在这一行
int fromArgv = NULL;
我相信NULL
通常被定义为(void *) 0
,这是一个指针。您将此指针指定给int
变量,这会给您错误。
但是,在这种情况下,无需初始化fromArgv
。你可以这样做:
int fromArgv; /* holds value from argv[1] */
fromArgv = atoi (argv[1]); /* convert argv[1] to int */
甚至只是
int fromArgv = atoi (argv[1]); /* convert argv[1] to int */
但是,您需要做的是确保在访问它之前存在argv[1]
,这样如果用户没有输入任何命令行参数,就不会出现段错误。您应该在分配if (argc != 2)
之前移动fromArgv
测试。
答案 1 :(得分:3)
NULL
是一个空指针常量,并且您尝试将其分配给整数值(fromArgv
),因此您的编译器报告警告。
以下初始化工作正常:
fromArgv = 0;
虽然它没用,但是你要在下一行修改变量的值:
int fromArgv = atoi(argv[1]);
顺便说一句,从main
返回这种值是一个坏主意(它通常被保留给错误代码),而且你过早地支持参数的数量。
答案 2 :(得分:1)
正如其他人所提到的,您正在使用“空指针”(从类型的角度来看是一个指针)初始化一个整数,这是错误的。你想把它初始化为零,
int fromArgv = 0;
然后,您应该选择参数并在后将其转换为int ,而不是在检查参数数量之前。因此,您应该在if (argc != 2)
部分之后移动“atoi”行。
还要考虑使用strtol
代替atoi
的可能性。前者允许您检查转换是否成功。
答案 3 :(得分:0)
你不能将fromgv初始化为NULL,因为NULL是一个指针,你将它分配给int 只需将行更改为fromArgv;
答案 4 :(得分:0)
为什么你必须从Argv初始化?
刚
int fromArgv = atoi(arg[1]);
应该工作正常