我有这段代码
www.myweb.com/article-1 // assume 1 is article_id
当我使用命令 ./ a.out 6 执行编译代码时,它打印54号,但我需要6个。
答案 0 :(得分:3)
命令行参数作为C字符串传递,而不是作为数字传递。您不能将C字符串转换为其对应的数字,因为它是指向字符序列的指针,而不是数字本身。
您的代码尝试将代表6
的字符串中的第一个字符(即"6"
)转换为int
。转换成功,因为char
是一个完整的数字类型,但是你得到54而不是6,因为这是你系统上'6'
的字符代码。
您可以使用atoi
正确进行转换:
int n = atoi(argv[1]);
printf("%i\n", n);
您需要包含<stdlib.h>
才能进行编译。
答案 1 :(得分:2)
您正在将一个char *类型转换为int。这将导致它的ASCII值。 %i和%d指向相同的东西,即有符号整数
参考:Format specifiers in C
您可以使用以下
origin/bar
或
printf("%s", argv[1]);
请记住,在使用atoi(argv 1)时,应该没有其他ASCII字符,如 - ,+等。在这些情况下,atoi()将返回0,因为atoi()不会检测到任何错误(参考:http://linux.die.net/man/3/atoi)。所以请记住从参数中删除所有这些字符,然后传递纯数字。另外,如果你喜欢它,你也可以写自己的atoi()。
答案 2 :(得分:0)
首先,你不能像这样向char *
施放int
。看看atoi();
。
接下来,如果您只想打印十进制数字,则应该使用%d
标记,而不是%i
。如果你想打印每个参数,你应该使用%s
标志,这样你就不必抛出你的论点。
最后但并非最不重要的是,在您的代码中,您不会打印参数,而是输出值的指针。 6似乎指向54,这是它的ASCII值。 要打印该值,您可以执行以下操作:
printf("%d\n", atoi(argv[1]));
OR
printf("%s\n", argv[1]);